简体   繁体   English

ListView在Android中无法正常构建

[英]ListView not builing properly in Android

I am working with simple List view using this code, 我正在使用此代码使用简单的列表视图,

public class RadioDemoActivity extends Activity {
ArrayList<String> list = new ArrayList<String>();
MyListAdapter mla;
ListView lv;
int position = -1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    lv = (ListView) findViewById(R.id.listView1);

    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    list.add("five");
    list.add("six");
    list.add("seven");
    list.add("eight");
    list.add("nine");
    list.add("ten");
    list.add("eleven");
    list.add("twelve");
    list.add("thirteen");
    list.add("fourteen");
    list.add("fifteen");
    list.add("sixteen");
    list.add("seventeen");
    list.add("eightteen");
    list.add("nineteen");
    list.add("twenty");

    mla = new MyListAdapter(this);
    lv.setAdapter(mla);

}


public class MyListAdapter extends BaseAdapter {
    private LayoutInflater mInflater;

    public MyListAdapter(Context context) {
        mInflater = LayoutInflater.from(context);

    }

    public int getCount() {
        return list.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.cust_list, null);

            TextView tv = (TextView)convertView.findViewById(R.id.txt_title);
            ImageView iv = (ImageView)convertView.findViewById(R.id.imageView1);
            tv.setText(list.get(position));
            Log.v("log_tag","position In"+list.get(position));

        }
        return convertView;
    }
  }
}

but result is like in Image after eleven its showing me one,one, two. 但是结果就像在Image中显示十一,一,二之后。 please help me 请帮我 在此处输入图片说明

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
         ListHolder holder = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.cust_list, null);
            holder=new ListHolder();
            holder.tv = (TextView)convertView.findViewById(R.id.txt_title);
            holder.iv = (ImageView)convertView.findViewById(R.id.imageView1);
            Log.v("log_tag","position In"+list.get(position));
            convertView.setTag(holder);
        }
         else
        {
        holder=(ListHolder) convertView.getTag();
        }
        holder.tv.setText(list.get(position));
        return convertView;
    }
 static class ListHolder
{
    TextView tv;

    ImageView iv;
}

Always write else condition in holder. 始终在保持器中写其他条件。

change your getView() to: 将您的getView()更改为:

public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.cust_list, null);
    }
    TextView tv = (TextView)convertView.findViewById(R.id.txt_title);
    ImageView iv = (ImageView)convertView.findViewById(R.id.imageView1);
    tv.setText(list.get(position));
    Log.v("log_tag","position In"+list.get(position));

    return convertView;
}

Can't add the comment in "right" place, but Niteesh Mehra's suggestion above to put LV in scrollview is wrong. 无法在“正确的”位置添加注释,但是上面Niteesh Mehra的建议将LV放入scrollview是错误的。 LV is a view that shows items in a vertically scrolling list, so there's no point of doing so again. LV是在垂直滚动列表中显示项目的视图,因此没有必要再次这样做。

As for your problem - your getView() implementation is wrong. 至于您的问题-您的getView()实现是错误的。 You should reuse view given if convertView is not null, but reuse means you got view (layout) already baked, but you still have to fill it with content right for this row. 如果convertView不为null,则应该重用给定的视图,但是重用意味着您已经烘焙了视图 (布局),但是仍然必须为此行填充内容。 So you should do something like: 因此,您应该执行以下操作:

if( convertView == null ) {
 convertView = <inflate view from XML>;
}

Then you your data in view's elements unconditionally . 然后,您将无条件地将数据放入视图的元素中。

I changed my getView() like this and problem solved. 我这样更改了getView()并解决了问题。

public View getView(int position, View convertView, ViewGroup parent) {

        convertView = mInflater.inflate(R.layout.cust_list, null);

        TextView tv = (TextView) convertView.findViewById(R.id.txt_title);
        ImageView iv = (ImageView) convertView.findViewById(R.id.imageView1);

        tv.setText(list.get(position));
        tv.setTag(list.get(position));

        if (RadioDemoActivity.this.position==position)
            iv.setImageResource(R.drawable.greenround);

        return convertView;

    }

change getView method like this 改变这样的getView方法

if (convertView == null) {
        convertView = mInflater.inflate(R.layout.cust_list, null);
        }
        TextView tv = (TextView)convertView.findViewById(R.id.txt_title);
        ImageView iv = (ImageView)convertView.findViewById(R.id.imageView1);
        tv.setText(list.get(position));
        Log.v("log_tag","position In"+list.get(position));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM