Java 如何在Android中检索listview焦点?

Java 如何在Android中检索listview焦点?,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我有一个基本适配器,它作为类助手来设置自定义listview。现在一切都正常了,除非我尝试设置另一个基本适配器,否则listview会在设置它之前失去我所关注的项目的焦点。我不知道是否有一种方法可以帮助我在同一个项目上恢复相同的焦点。事先非常感谢 这是我的基本适配器类: class CustomAdapterWithImages extends BaseAdapter { LayoutInflater mInflater; public CustomAdapterW

我有一个基本适配器,它作为类助手来设置自定义listview。现在一切都正常了,除非我尝试设置另一个基本适配器,否则listview会在设置它之前失去我所关注的项目的焦点。我不知道是否有一种方法可以帮助我在同一个项目上恢复相同的焦点。事先非常感谢

这是我的基本适配器类:

    class CustomAdapterWithImages extends BaseAdapter {

    LayoutInflater mInflater;


    public CustomAdapterWithImages(){
        mInflater = (LayoutInflater) Home.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount(){
        // TODO Auto-generated method stub
        return ids_list.size();//listview item count. 
    }

    @Override
    public Object getItem(int position){
        // TODO Auto-generated method stub
        return position; 
    }

    @Override
    public long getItemId(int position){
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        // TODO Auto-generated method stub

        ViewHolder vh;

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.layout_row, null);
            vh = new ViewHolder();
            convertView.setTag(vh);
           }else{
            vh = (ViewHolder) convertView.getTag();
           }            

        TextView book = (TextView) convertView.findViewById(R.id.listViewBookName);
        TextView writer = (TextView) convertView.findViewById(R.id.listViewWriterName);     
        ImageView image = (ImageView) convertView.findViewById(R.id.listViewImage);

        try{
            book.setText(names_list.get(position));
            writer.setText(writers_list.get(position));       
            image.setImageBitmap(thumbnails_list.get(position));
        }catch(IndexOutOfBoundsException e){
            e.printStackTrace();
        }

        return convertView;
    }

 class ViewHolder{
    TextView book, writer;
    ImageView image;
    }
}   
通过调用基本适配器类,我可以设置我的listview,如下所示:

listview.setAdapter(new CustomAdapterWithImages());    

更换适配器后是否要将同一项目标记为选中/聚焦? 如果是这样,您可以将所选项目的位置传递给新适配器,并在getView(…)中对其进行评估。 列表中的项目应该有onClickListeners来设置所选位置的索引。 这至少是我能想象的一种方式,当我做对的时候,你可以做你想做的事

如果您想更新列表,因为适配器中的某些数据已更改,您可以只调用 yourAdapter.notifyDataSetChanged()而不是创建新的适配器


首先,我建议您将BaseAdapter更改为ArrayAdapter。 我不知道是否可以根据API向BaseAdapter添加项 没有这样的方法。 ArrayAdapter允许您通过调用方法add()addAll()将对象放入适配器。 在这些方法中,您可以放置单个图像或全部图像,完成后只需调用notifyDataSetChanged(),列表就会自动更新

您可以像Ashish Bindal那样实现一个侦听器。将其附加到列表中,例如在为列表设置适配器的位置。position参数是侦听器附加到的项的索引,也是您可能要查找的内容。每次单击项目时,您都必须将其位置存储在侦听器之外的某个位置

在自定义适配器中添加一个新字段(例如private int selectedItemPosition;)和一个setter方法来设置此字段。 在getView()中,必须检查位置参数的值是否等于字段selectedItemPosition的值。如果是,则convertView是您可以关注的项目

在调用notifyDataSetChanged()之前,必须使用setter方法设置适配器中选定项的位置

但是 这仅在项目顺序不会更改且项目不会丢失的情况下有效

您真正需要的是可以用来唯一区分项目的东西。 setOnItemClickListener()的参数之一是ArrayAdapter。您可以通过调用arrayAdapters方法getItemAtPosition(position)访问附加到已单击列表项的对象。如果您的对象具有唯一的属性,例如ID,这非常好。如果没有,您可以将其包装在自定义对象中,例如使用ID或其他唯一属性。 因此,您可以获取unique属性并将其传递给适配器,而不是侦听器中的位置


祝你好运。

附加项目单击listView的listener并保存最后选择的位置。设置基本适配器后,设置适当的选定位置/项目

//set the selected item according after changing anther base adapter
listview.setSelection(appropriatePosition)

//To find last selected item position
listview.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
        lastSlectedPosition = position;
        //or get reference to unique item in your list from the position if you are changing the dataset also.
    }
}
//更改另一个基本适配器后,根据设置所选项目
listview.setSelection(适当位置)
//查找最后选定的项目位置的步骤
setOnItemClickListener(新的OnItemClickListener(){
公共控件单击(适配器视图适配器,视图v,内部位置,长id){
lastSlectedPosition=位置;
//或者,如果同时更改数据集,则从位置获取列表中唯一项的引用。
}
}

完全正确。我想在下载图像后用图像更新适配器。但我不知道怎么做。请您进一步解释一下更新适配器数据的相关内容,好吗?谢谢您,先生。