如何选择android listview

如何选择android listview,android,listview,select,horizontallist,Android,Listview,Select,Horizontallist,我在android中使用了horizontallistview。而且做得很好。当我点击时,我选择了horizontallistview项目。而且它也起了作用。单击时,一个项目的背景已更改。这是我的源代码 TextView selectedListItem = null; String pre_Color = "#6C6C6C"; String select_Color = "#FFFFFF"; @Override protected void onCre

我在android中使用了horizontallistview。而且做得很好。当我点击时,我选择了horizontallistview项目。而且它也起了作用。单击时,一个项目的背景已更改。这是我的源代码

    TextView selectedListItem = null;
    String pre_Color = "#6C6C6C";
    String select_Color = "#FFFFFF";

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

        listview = (HorizontialListView) findViewById(R.id.listview);
        listview.setAdapter(mAdapter);

        listview.setOnItemClickListener(new ListViewItemClickListener());

    }

    private class ListViewItemClickListener implements
            AdapterView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            mPager.setCurrentItem(position);

            if (selectedListItem != null) {
                TextView previousTitle = (TextView) selectedListItem
                        .findViewById(R.id.title);
                previousTitle.setBackgroundResource(R.drawable.list_shape);
                previousTitle.setTextColor(Color.parseColor(pre_Color));
            }

            TextView title = (TextView) view.findViewById(R.id.title);
            title.setBackgroundResource(R.drawable.list_selected_shape);
            title.setTextColor(Color.parseColor(select_Color));

            selectedListItem = title;
        }
    }
但当我在同一点上拖动horizontallistview并再次拖动时,我通过单击更改的项目没有更改!!!!这让我发疯

像这张图片一样,我选择了一个项目。我拖拽了一些东西,回到这里

然后

事情变成这样了。没有蓝色背景


我该怎么做才能解决这个问题

这是由于列表视图循环,我会制作一个自定义绘图,并在选中时将其显示为选中状态,然后在项目上单击调用

listview.setItemChecked(position, true);

您将需要处理未选中的其他项。

该错误是因为Android在生成视图时保留视图,以便在再次显示视图时重用它

请特别阅读适配器文档中的convertView参数:

在getView中可能有类似的内容:

if(convertView != null){
    return convertView;
}
如果您计划在listview中更新视图,这不是一个好方法。 最好的方法是使用ViewHolder图案,如下所述:


跟踪单击的项目。然后在适配器中的getview中,检查项目的位置是否与单击的位置匹配,如果匹配,请将其bg resource设置为所需的颜色或可绘制颜色


希望对您有所帮助。

在这种情况下,我认为您需要从ArrayAdapter类管理它。 在这里,您必须记住上次单击的项目视图和位置

其基本思想是只单击列表项,然后将单击的位置和项目视图传递给适配器 我们将用您喜欢的颜色设置它的背景,并将最后选择的颜色更改为查看 背景色设置为默认颜色

 public class SampleAdapter extends ArrayAdapter<Object> {

    private int mSelection = 0;

    public SampleAdapter(Context context, int resource, int textViewResourceId,
            List<Object> objects) {
        super(context, resource, textViewResourceId, objects);
    }

    public void setSelection(int mSelection, View selectedItemView) {
        this.mSelection = mSelection;

        if (selectedItemView!= null && lastSelectedRow != null
                && selectedItemView!= lastSelectedRow) {
            lastSelectedRow
                    .setBackgroundResource(R.drawable.bg_normal);
            selectedItemView
                    .setBackgroundResource(R.drawable.bg_selected);
        }

        this.lastSelectedRow = selectedItemView;

    }

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

        //Usual code logic here....

        if (mSelection == position) {
            mViewHolder.mRootView
                    .setBackgroundResource(R.drawable.bg_selected);
            lastSelectedRow = mViewHolder.mRootView; 
        } else {
            mViewHolder.mRootView
                    .setBackgroundResource(R.drawable.bg_normal);
        }


        return view;
    }

    private static class ViewHolder {
        TextView name;
        View mRootView;
    }
}

我照你的回答做了。现在我有另一个问题。当我单击一个项目时,该项目不再更改以前的背景。但如果我点击了第一个项目,那么fiveitem也会发生变化。如果我点击了第四项,那么第九项被改变了。那么你得到解决方案了吗?因为我有同样的问题,我和你一样实现了同样的问题。所以我你解决了这个问题,请给出一些想法。
public void onItemClick(AdapterView<?> arg0, View listItemView,
        int position, long id) {

    if(myAdapter != null )
    {
        myAdapter.setSelection(position,listItemView);
    }
}
myAdapter.setSelection(position,mListViwe.getChildAt(pos));
mListViwe.setSelectionFromTop(position, 0);