更改列表视图中特定项目的图像视图

Posted

技术标签:

【中文标题】更改列表视图中特定项目的图像视图【英文标题】:Changing imageview of a specific item in a listview 【发布时间】:2015-05-24 05:56:13 【问题描述】:

我想根据一些意图值更改列表视图中的图像视图。为此,我确实重写了简单光标适配器的类,如下所示,

public class NotesAdapter extends SimpleCursorAdapter 
Intent intent;

        public NotesAdapter(Context context, int layout, Cursor c, String[] from, int[] to, Intent i) 
            super(context, layout, c, from, to);
            intent=i;
        


        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
           View item =  super.getView(position, convertView, parent);
           ImageView image =  (ImageView) item.findViewById(R.id.icon);
           ImageView image2= (ImageView) item.findViewById(R.id.icon2);
          if (intent.getStringExtra("category")!=null && intent.getStringExtra("category").equalsIgnoreCase("draft"))
                image.setVisibility(View.GONE);
                image2.setVisibility(View.VISIBLE);
            
            return item;

        
    

在包含列表视图的活动中,我定义了 NotesAdapter 并在片段 onCreateView 方法中对其进行初始化,如下所示,

mSimpleCursorAdapter = new NotesAdapter(getActivity(), R.layout.notes_row, null, from, to, getActivity().getIntent());

这是我初始化适配器的代码,

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 


        View rootView = inflater.inflate(R.layout.fragment_todo_list, container, false);
        mSimpleCursorAdapter = new NotesAdapter(getActivity(), R.layout.notes_row, null, from, to, getActivity().getIntent());

        getLoaderManager().initLoader(LOADER_ID, null, this); //once this is done onCreateLoader will be called.
         final ListView listView = (ListView) rootView.findViewById(R.id.notes_list); //findViewById must be called using the rootView because we are inside a fragment.
         listView.addFooterView(new View(getActivity()), null, true);

        text=  (TextView) rootView.findViewById(R.id.empty_list);

        listView.setAdapter(mSimpleCursorAdapter);


        if(mSimpleCursorAdapter.isEmpty()) 
            text.setVisibility(View.VISIBLE);
            listView.setEmptyView(text);
            if (getActivity().findViewById (R.id.fragment_container)!=null)
                getActivity().getSupportFragmentManager().beginTransaction()
                        .replace(R.id. fragment_container, new EmptyEditor()).commit();
            
        
        else 
            text.setVisibility(View.INVISIBLE);
        

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() 

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) 

                Cursor cursor = mSimpleCursorAdapter.getCursor();
                if (cursor != null && cursor.moveToPosition(position)) 

                    String category= cursor.getString(1);
                    String summary= cursor.getString(2);
                    String description=cursor.getString(3);
                    long id= cursor.getLong(cursor.getColumnIndex(NotesContract.NotesTable._ID));
                    int locationId= cursor.getInt(cursor.getColumnIndex(NotesContract.NotesTable.COLUMN_LOCATION));

                    String [] retrievedData= category, summary, description;


                    if (getActivity().findViewById (R.id.fragment_container)!=null)
                        //two pane layout
                        listView.setFocusable(true);
                        listView.setSelection(position);
                        Bundle args = new Bundle();
                        args.putStringArray("data",retrievedData);
                        /*args.putInt("update", 1);*/
                        args.putLong("id", id);
                        args.putInt("locationId", locationId);
                        mCallback.onlistElementClicked(args );/*this is available in the parent activity*/
                    

                    else 
                       // one pane layout:

                        Intent intent = new Intent(getActivity(), NotesDetails.class);
                        intent.putExtra(Intent.EXTRA_TEXT, retrievedData);
                        /*intent.putExtra("update", 1); */ //to indicate that the query should be update not insert.
                        intent.putExtra("id", id);
                        intent.putExtra("locationId", locationId); //whether it is 0 or 1
                        startActivity(intent);
                    


                //end outer cursor if.
            
        );

        return rootView;
    

这是行布局的xml文件,

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_
              android:layout_
              >
    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal">
        <ImageView
            android:id="@+id/icon"
            android:layout_
            android:layout_
            android:layout_marginRight="8dp"
            android:layout_marginTop="8dp"
            android:src="@drawable/staricon"
            android:visibility="visible">
        </ImageView>

        <ImageView
            android:id="@+id/icon2"
            android:layout_
            android:layout_
            android:layout_marginRight="8dp"
            android:layout_marginTop="8dp"
            android:src="@drawable/drafticon"
            android:visibility="gone">
        </ImageView>


        <TextView
            android:id="@+id/label"
            android:layout_
            android:layout_
            android:layout_marginTop="6dp"
            android:lines="1"
            android:text="@+id/TextView01"
            android:textSize="24dp"
            >
        </TextView>
    </LinearLayout>

    <TextView
        android:id="@+id/date"
        android:layout_
        android:layout_/> <!--text will be set dynamically -->
    </LinearLayout>

但是有一个问题,我只希望更改特定项目的图像(基于意图值),但是当图像更改时,所有其他图像都会更改。我认为这是因为 simplecursoradapter 对所有项目使用相同的 xml 文件。但是,我找不到解决方案,它只是不断改变所有的图像视图。我需要更改其图像视图的项目是最后保存的项目。我有另一个活动,用户在其中创建笔记,并指定它们的类型(草稿或重要),当用户单击保存时,该项目被添加到列表中,并且应该根据类型(使用意图)更改图像视图,这个当用户编辑列表中的现有项目时也适用。

任何人都可以为这个问题提出一个解决方案吗?

非常感谢任何帮助。

谢谢。

【问题讨论】:

【参考方案1】:

我只想更改特定项目的图像(基于 意图值)

正是如此,您必须将您的意图的价值与此项目进行比较。并且 Item 基于 ListView 中的位置

因此,只需根据位置从列表中获取数据对象,并将其与 Intent 的值进行比较,并据此更改 Imageview 的可见性。

并在getView() Image可见性方法中添加else部分作为相反的。

@Override
    public View getView(int position, View convertView, ViewGroup parent) 
       View item =  super.getView(position, convertView, parent);

       Cursor cursor = getCursor();

       ImageView image =  (ImageView) item.findViewById(R.id.icon);
       ImageView image2= (ImageView) item.findViewById(R.id.icon2);

      // Add one more comparison expression for data object position value which has draft value 
       if (cursor.getString(1).equalsIgnoreCase("draft"))
            image.setVisibility(View.GONE);
            image2.setVisibility(View.VISIBLE);
        else if (cursor.getString(1).equalsIgnoreCase("important"))
        
            image.setVisibility(View.VISIBLE);
            image2.setVisibility(View.GONE);
        
        return item;
    

【讨论】:

【参考方案2】:

如果您的意思是您的线对象已更新,您必须在适配器的 DATA 处更改它的内容并触发 RowUpdateds。

这样,您的视图将使用新值重新创建。

【讨论】:

以上是关于更改列表视图中特定项目的图像视图的主要内容,如果未能解决你的问题,请参考以下文章

android在单击按钮时更改列表视图内的图像视图

使用 objectAtIndex:indexPath.row 选择来更改滚动视图图像

当列表视图的项目在颤动的视口中可见时,如何更改项目颜色并执行一些操作?

在创建视图的片段期间为项目列表中的每个项目设置图像[重复]

从视图表中获取数据时出现 Laravel 错误

在 Picasso 图像加载器中加载位图图像会减慢列表视图中的滚动速度