【问题标题】:How to hide/show imageview in RecyclerView according to there position如何根据那里的位置在 RecyclerView 中隐藏/显示 imageview
【发布时间】:2017-05-27 06:25:06
【问题描述】:

我的 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");

}
}

我从 google 找到了这个来检查 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);
 }

【问题讨论】:

  • 你需要长按选择列表中的几个项目&选择项目时需要隐藏图像对吗?
  • 我正在使用回收站视图和卡片视图,并在该视图中显示我需要的数据库数据,当用户长按特定位置时,如果用户单击锁定选项,图像应该显示,如果用户单击,则会出现两个选项解锁选项图像应该消失我面临的问题它唯一显示并将图像隐藏在最后一个位置
  • 问题是由于,recycler view会回收items view。您必须更新onBindViewHolder 中的视图。我需要你需要在哪个位置隐藏/显示图像,然后我才能给出正确的代码
  • 我的意思是你在哪里跟踪锁定/解锁项目的位置?
  • 图像视图在所有视图中..如果用户需要隐藏第三个位置或第四个或第一个位置的图像,它取决于用户..

标签: android android-recyclerview


【解决方案1】:

您需要在适配器中跟踪锁定或解锁项目的位置,例如

ArrayList&lt;Integer&gt; lockedItems = new ArrayList&lt;Interger&gt;;

和 添加,删除项目。

或者你可以在你的模型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 或 card view 时显示
  • “当用户长按特定位置时,如果用户单击锁定选项图像应该显示,并且如果用户单击解锁选项图像应该消失,则会出现两个选项”,我的问题是我是否给出一个位置like 3 你怎么知道那个项目现在是处于锁定状态还是解锁状态
  • 我很困惑,请帮助我是 android 新手
  • 离开图像视图隐藏/显示,您如何最终获得锁定项目/解锁项目,也发布您的活动代码,并且您的 onItemLongClick 实现为空,您如何显示选项锁定还是解锁?
  • 我在 recyclerview 和卡片视图中显示 sqlite 数据..我只是在每一行中放置一个锁定图像。然后将 LongclickListner 放入带有两个选项锁定的回收器,如果用户长按,我需要解锁在任何项目上出现两个选项,如果用户单击锁定图像应该显示,如果用户单击解锁图像应该隐藏仅用户长按的那个项目..我希望你现在明白
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多