如何根据位置在RecyclerView中隐藏/显示ImageView

3

我在RecyclerView中有一个锁定图片,希望在长按时隐藏/显示它。我想根据其位置进行隐藏/显示,例如如果我在RecyclerView的第一项上执行长按并单击隐藏,它将仅隐藏该项的图像而不影响其他项。我已经尝试过这个功能,但问题是它只会隐藏/显示最后一项的图像。请帮忙解决,谢谢。

RecyclerViewAdapter

 public class RecycleViewAdapter extends 
 RecyclerView.Adapter<RecycleViewHolder> {
 private List<FileName> fileNames;
 private Context context;
 private OnItemClicked onClick;
 String Name;
 RecycleViewHolder mainHolder;

public RecycleViewAdapter(Context context,List<FileName> fileNames) {
    this.context = context;
    this.fileNames = fileNames;
 }
public interface OnItemClicked {
    void onItemClick(int position);
}

@Override
public RecycleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
 {
    LayoutInflater mInflater = LayoutInflater.from(parent.getContext());
    ViewGroup mainGroup = (ViewGroup) mInflater.inflate(R.layout.grid_item, 
    parent, false);
    RecycleViewHolder listHolder = new RecycleViewHolder(mainGroup);
    return listHolder;

  }

@Override
public void onBindViewHolder(RecycleViewHolder holder, final int position) {
    final FileName model = fileNames.get(position);
    mainHolder = (RecycleViewHolder) holder;
    mainHolder.title.setText(model.getShorttext());
    mainHolder.note.setText(model.getName());
    mainHolder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onClick.onItemClick(position);

        }
    });
    mainHolder.setLongClickListener(new LongClickListener() {
        @Override
        public void onItemLongClick(int position) {

        }
    });
}

@Override
public int getItemCount() {
    return (null != fileNames ? fileNames.size() : 0);
}
public void setOnClick(OnItemClicked onClick)
{
    this.onClick=onClick;
}
public void getItemSelected(MenuItem item)
{
        if (item.getItemId() == 0) {
            mainHolder.imageView.setVisibility(View.VISIBLE);
        } else {
            mainHolder.imageView.setVisibility(View.INVISIBLE);
        }

}

}

RecyclerViewHolder:

 public class RecycleViewHolder extends RecyclerView.ViewHolder implements 
 View.OnLongClickListener,View.OnCreateContextMenuListener {
 public TextView title;
 public TextView note;
 public CardView cardView;
 public ImageView imageView;
 LongClickListener longClickListener;

 public RecycleViewHolder(View view) {
    super(view);
    this.title = (TextView) view.findViewById(R.id.title);
    this.note = (TextView) view.findViewById(R.id.note);
    this.cardView = (CardView) view.findViewById(R.id.card_view);
    this.imageView = (ImageView) view.findViewById(R.id.lock);
    imageView.setVisibility(View.INVISIBLE);
    view.setOnLongClickListener(this);
    view.setOnCreateContextMenuListener(this);


}
public void setLongClickListener(LongClickListener lc)
{
    this.longClickListener = lc;

}

@Override
public boolean onLongClick(View v) {
    this.longClickListener.onItemLongClick(getLayoutPosition());
    return false;
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, 
 ContextMenu.ContextMenuInfo menuInfo) {
    menu.add(0,0,0,"Lock");
    menu.add(0,1,0,"UnLock");

}
}

我从谷歌上找到了一个检查 Bindview 位置的方法,但我不知道如何在getItem selected中实现。

if (position == eventsList.size() -1){
holder.profileImage.setVisibility(View.INVISIBLE)
}else{
holder.profileImage.setVisibility(View.VISIBLE)
}

主活动:

  public class MainActivity extends AppCompatActivity implements 
 RecycleViewAdapter.OnItemClicked{
List<FileName> filenames;
DBhelper dBhelper;
SQLiteDatabase sqLiteDatabase;
ListViewAdapter listViewAdapter;
ListView listView;
ImageView lock;
String name,note;
String col;
private static RecyclerView recyclerView;
RecycleViewAdapter recycleViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    checkFirstRun();
    //listView = (ListView)findViewById(R.id.lv_filename);
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    lock =(ImageView)findViewById(R.id.lock);
    dBhelper = new DBhelper(getApplicationContext());
    sqLiteDatabase =dBhelper.getReadableDatabase();
    filenames = dBhelper.getItemFromDatabase(sqLiteDatabase);
    initViews();
    if(filenames != null) {
        recycleViewAdapter = new 
       RecycleViewAdapter(MainActivity.this,filenames);
        recyclerView.setAdapter(recycleViewAdapter);
        //listViewAdapter = new ListViewAdapter(getApplicationContext(), 
        R.layout.activity_main, filenames);
        //listView.setAdapter(listViewAdapter);
    }
        recycleViewAdapter.setOnClick(this);

      //        registerForContextMenu(listView);
   /* listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            name = filenames.get(position).getName();
            note = filenames.get(position).getShorttext();
            Alert();

        }
    });*/
}
private void initViews() {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    recyclerView.setHasFixedSize(true);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, 
    StaggeredGridLayoutManager.VERTICAL));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_menu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_add:
            Intent intent = new Intent(MainActivity.this, Note.class);
            startActivity(intent);
            return true;
        case R.id.action_pass:
            Intent i = new Intent(MainActivity.this, ChangePass.class);
            startActivity(i);
            return true;
        case R.id.action_list:
            Intent intent2 = new Intent(MainActivity.this, ToDo.class);
            startActivity(intent2);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

public void Alert()
{
    View mview = getLayoutInflater().inflate(R.layout.dialog_pass,null);
    final EditText mEdittext = (EditText) mview.findViewById(R.id.Epass);
    AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);
    mBuilder.setView(mview);
    mBuilder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {


        }
    });
    mBuilder.setNegativeButton("Cancel",null);
    mBuilder.setCancelable(false);
    final AlertDialog dialog = mBuilder.create();
    dialog.show();
    dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            String col = mEdittext.getText().toString();
            String password = dBhelper.searchpass(col);
            if (col.equals(""))
            {
                mEdittext.setError("Please fill the blank field");
            }
            else if (col.equals(password))
            {
                Intent intent =  new Intent(MainActivity.this,Note2.class);
                intent.putExtra("Name",name);
                intent.putExtra("Note",note);
                startActivity(intent);
                dialog.dismiss();
            }
            else {
                Toast temp = Toast.makeText(MainActivity.this, "Password does not match", Toast.LENGTH_SHORT);
                temp.show();
            }
        }
    });

}
public void checkFirstRun() {
    boolean isFirstRun = getSharedPreferences("PREFERENCE", MODE_PRIVATE).getBoolean("isFirstRun", true);
    if (isFirstRun){

        View view = getLayoutInflater().inflate(R.layout.first_run_dialog,null);
        final EditText FirstPass = (EditText) view.findViewById(R.id.Fpass);
        final Button submit = (Button)view.findViewById(R.id.ok);
        final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        builder.setCancelable(false);
        builder.setView(view);
        final AlertDialog dialog1 = builder.create();
        submit.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              col = FirstPass.getText().toString();
              if (col.equals(""))
              {
                  FirstPass.setError("Please fill the field");
              }
              else{
              savePass();
              Toast.makeText(MainActivity.this, "Password Created", Toast.LENGTH_SHORT).show();
                  dialog1.dismiss();
              }
          }
      });
        dialog1.show();
        dialog1.setCanceledOnTouchOutside(false);



        getSharedPreferences("PREFERENCE", MODE_PRIVATE)
                .edit()
                .putBoolean("isFirstRun", false)
                .apply();
    }
}
public void savePass()
{
    dBhelper = new DBhelper(this);
    sqLiteDatabase= dBhelper.getWritableDatabase();
    dBhelper.storePass(col,sqLiteDatabase);
}
@Override
public void onItemClick(int position) {
    name = filenames.get(position).getName();
    note = filenames.get(position).getShorttext();
    Alert();
}


@Override
public boolean onContextItemSelected(MenuItem item) {
    recycleViewAdapter.getItemSelected(item);
    return super.onContextItemSelected(item);
    }


 }   

我的界面:

public interface LongClickListener {
void onItemLongClick(int position);
 }

enter image description here


问题是由于回收视图将回收项目视图。您必须在 onBindViewHolder 中更新视图。我需要知道您需要隐藏/显示图像的位置,然后我才能提供正确的代码。 - Vignesh Sundaramoorthy
我的意思是你正在追踪锁定/解锁的项目位置吗? - Vignesh Sundaramoorthy
该ImageView出现在所有视图中。它取决于用户是否需要隐藏第三个、第四个或第一个帖子的图片。 - faiz mir
当您调用“getItemSelected”时,它的返回类型为“void”,这意味着您没有获取到任何内容,这是否应该是“setSelectedItem”? - Vignesh Sundaramoorthy
在我的活动类中,没有getitemSelected方法。 - faiz mir
显示剩余3条评论
1个回答

3
您需要在适配器中跟踪锁定或解锁的项目位置,例如: ArrayList<Integer> lockedItems = new ArrayList<Interger>; 您可以向其添加、删除项目。
或者您可以在模型FileName中使用Boolean字段。
实际上,您需要一种方法来确定给定位置的图像是否需要隐藏或显示。
如果您知道在给定位置上是否需要隐藏/显示,则可以在onBindViewHolder中更新视图。
    @Override
    public void onBindViewHolder(RecycleViewHolder holder, final int position) {
        final FileName model = fileNames.get(position);
        RecycleViewHolder recycleViewHolder = (RecycleViewHolder) holder;
        recycleViewHolder.title.setText(model.getShorttext());
        recycleViewHolder.note.setText(model.getName());
        if (model.isLocked()) { // or if (lockedItems.contains(position))
            recycleViewHolder.imageView.setVisibility(View.VISIBLE);
        } else {
            recycleViewHolder.imageView.setVisibility(View.INVISIBLE);
        }

编辑

向适配器添加一个字段selectedItem来跟踪长按项的位置,并在长按时存储项的位置。

holder.setLongClickListener(new LongClickListener() {
    @Override
    public void onItemLongClick(int position) {
        selectedItem = position
    }
});

getItemSelected 中使用该位置,并将其添加到 lockedItemsList 中,或在 FileName 中添加一个 boolean 字段并更新其值,使用它来确定给定位置的项目是锁定还是解锁。


首先,这个图片不在ArrayList中,它在CardView里。其次,我需要在RecyclerView或CardView上长按时隐藏和显示该图片。 - faiz mir
1
当用户在特定位置上长按时,将出现两个选项,如果用户点击锁定选项,则图像应显示,如果用户点击解锁选项,则图像应消失。我的问题是,如果我提供一个位置(如3),您如何知道该项当前处于锁定还是解锁状态?您好,对于您的问题,我的回答是:在代码中需要使用某种数据结构(例如数组或列表)来跟踪每个位置的锁定/解锁状态。这样,当用户单击锁定/解锁选项并更改图像状态时,我们可以更新相应位置的状态。因此,当您提供位置3时,我们可以查询该位置的状态以确定它当前处于锁定还是解锁状态。 - Vignesh Sundaramoorthy
1
请保留图像视图的隐藏/显示功能,最终如何获取已锁定/未锁定的项目,同时发布您的活动代码。您的 onItemLongClick 实现为空,您如何显示锁定或解锁选项? - Vignesh Sundaramoorthy
我正在将SQLite数据显示在RecyclerView和CardView中。我在每一行中放置了一个锁定图像,并在Recycler上放置了LongclickListner,提供了两个选项:锁定和解锁。如果用户长按任何项,将出现两个选项,如果用户单击锁定,则应显示图像,如果单击解锁,则应仅隐藏该项的图像,希望您现在明白了。 - faiz mir
选项只会在用户长按项目时显示吗? - Vignesh Sundaramoorthy
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接