如何在不删除回收者视图中的位置的情况下删除项目?

2023-12-04

我真的需要你的帮助。我用很多关键词在谷歌上搜索了很多天,但我找不到。所以,我决定向你请教。

所以,就在这里。实际上,我在 RecyclerView 中有一个按钮,但是这个按钮会根据可用的数据量而重复,有:带有文本“Baca 3x”、“Baca 4x”的按钮,等等。我想要,如果我点击带有文本“Baca 3x”的按钮 3 次,它将更改为“Baca 2x”>>“Baca 1x”>>删除项目。另外,如果我点击带有文本“Baca 4x”的按钮 4 次,它将更改为“Baca 3x”>>“Baca 2x”>>“Baca 1x”>>删除项目。

但我的问题是,我不能对每个按钮进行不同的处理,因为每次删除该项目时,数据的位置都会自动更改。因此,我无法获得特定的按钮。例如:有两个按钮,

 1. Button "Baca 3x" on position 0
 2. Button "Baca 4x" on position 1

如果位置0上的按钮“Baca 3x”被删除,那么按钮“Baca 4x”自动将其位置更改为0。问题就出在这里。

到目前为止,我只是根据每个按钮的位置来获取它们,这对我来说是一个问题。因此,我正在考虑如何在不删除回收站视图中的位置的情况下删除项目?你们能解决我的问题吗?我应该使用 DiffUtil 吗?如何使用它?下面是我使用的完整代码:

模型Doa.java

public class ModelDoa {

public static final int DOA_PAGI = 0;
public static final int DOA_SORE = 1;
public static final int DOA_MASJID = 2;
public static final int DOA_BANGUNT = 3;
public static final int DOA_MAU_TIDUR = 4;

private String mName;
private String bName;
private int mType;

public ModelDoa(String name, String butong, int type) {
    this.mName = name;
    this.bName = butong;
    this.mType = type;
}

public String getName() {
    return mName;
}

public void setName(String name) {
    this.mName = name;
}


public int getType() {
    return mType;
}

public void setType(int type) { this.mType = type; }


public String ambilName() {
    return bName;
}

public void setNama(String butonk) {
    this.bName = butonk;
}

}

AdapterDoa.java

public class AdapterDoa extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

public List<ModelDoa> mList;

public AdapterDoa(List<ModelDoa> list) {

    this.mList = list;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    switch (viewType) {

        case DOA_PAGI:
            View vieu = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_doa, parent, false);
            PagiViewHolder rcv = new PagiViewHolder(vieu, this);
            return rcv;

        case DOA_SORE:
            View doa = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_doa, parent, false);
            SoreViewHolder mdoa = new SoreViewHolder(doa);
            return mdoa;

        case DOA_MASJID:
            View dMasjid = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_doa, parent, false);
            MasjidViewHolder mMasjid = new MasjidViewHolder(dMasjid);
            return mMasjid;

        case DOA_BANGUNT:
            View dBangunt = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_doa, parent, false);
            BanguntViewHolder mBangunt = new BanguntViewHolder(dBangunt);
            return mBangunt;

        case DOA_MAU_TIDUR:
            View regut = LayoutInflater.from(parent.getContext()).inflate(R.layout.content_doa, parent, false);
            MauTidurViewHolder turu = new MauTidurViewHolder(regut);
            return turu;
    }
    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    ModelDoa object = mList.get(position);

    if (object != null) {

        switch (object.getType()) {

            case DOA_PAGI:
                ((PagiViewHolder) holder).mTitle.setText(object.getName());
                ((PagiViewHolder) holder).tombolbaca.setText(object.ambilName());
                break;

            case DOA_SORE:
                ((SoreViewHolder) holder).mTitle.setText(object.getName());
                ((SoreViewHolder) holder).tombolbaca.setText(object.ambilName());
                break;

            case DOA_MASJID:
                ((MasjidViewHolder) holder).mTitle.setText(object.getName());
                ((MasjidViewHolder) holder).tombolbaca.setText(object.ambilName());
                break;

            case DOA_BANGUNT:
                ((BanguntViewHolder) holder).mTitle.setText(object.getName());
                ((BanguntViewHolder) holder).tombolbaca.setText(object.ambilName());
                break;

            case DOA_MAU_TIDUR:
                ((MauTidurViewHolder) holder).mTitle.setText(object.getName());
                ((MauTidurViewHolder) holder).tombolbaca.setText(object.ambilName());
                break;
        }
    }
}

public void deleteItem(int position) {
    mList.remove(position); // hapus list
    notifyItemRemoved(position); // hapus tampilan
    // notifyItemRangeChanged( position, mList.size());
}

@Override
public int getItemCount() {
    if (mList == null)
        return 0;
    return mList.size();
}

@Override
public int getItemViewType(int position) {
    if (mList != null) {
        ModelDoa object = mList.get(position);
        if (object != null) {
            return object.getType();
        }
    }
    return 0;
}


}

PagiViewHolder.java

public class PagiViewHolder extends RecyclerView.ViewHolder {
public TextView mTitle;
public Button tombolbaca;
public Button teksbaca;
public Button tombolshare;
private RelativeLayout rl2;
private int klik10 = 10;
private AdapterDoa myAdapter;

public PagiViewHolder(View itemView, AdapterDoa myAdapter) {
    super(itemView);
    this.myAdapter = myAdapter;

    itemView.setOnClickListener(mainViewClickListener);
    mTitle = (TextView) itemView.findViewById(R.id.titleTextView);
    tombolbaca = (Button) itemView.findViewById(R.id.buttonbaca);
    tombolshare = (Button) itemView.findViewById(R.id.buttonshare);
    tombolbaca.setOnClickListener(bacaClickListener);
    tombolshare.setOnClickListener(shareClickListener);
    rl2 = (RelativeLayout) itemView.findViewById(R.id.relmasjid);
}

private View.OnClickListener bacaClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        teksbaca = (Button) v.findViewById(R.id.buttonbaca);

        // Baca 10x
        if( getAdapterPosition() ==0 ) {
            klik10--;
            teksbaca.setText("Baca " + klik10 + "x");

            if (klik10 <= 0)
            {
                // modify listItems however you want... add, delete, shuffle, etc
                myAdapter.deleteItem(getAdapterPosition());
            }
        }

    } // onclick
};

private View.OnClickListener shareClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // Do button click handling here
            Intent sendIntent = new Intent();
            sendIntent.setAction(Intent.ACTION_SEND);
            sendIntent.putExtra(Intent.EXTRA_TEXT, mTitle.getText().toString() + "\n \n download aplikasinya di: http://www.tauhid.or.id" );
            sendIntent.setType("text/plain");
            Intent.createChooser(sendIntent,"Share via");
            v.getContext().startActivity(sendIntent);
    }
};

private View.OnClickListener mainViewClickListener = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        // Do button click handling here
    }
};


}

DoaPagi.java

public class DoaPagi extends AppCompatActivity {

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

    // toolbar
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    //this line shows back button
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    List<ModelDoa> rowListItem =  getData();
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(DoaPagi.this);
    RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    mRecyclerView.setLayoutManager(linearLayoutManager);
    mRecyclerView.setHasFixedSize(true);
    AdapterDoa rcAdapter = new AdapterDoa(rowListItem);
    mRecyclerView.setAdapter(rcAdapter);

}

private List<ModelDoa> getData() {

    String[] data = getResources().getStringArray(R.array.doapagi);
    String[] baca = getResources().getStringArray(R.array.bacapagi);

    List<ModelDoa> list = new ArrayList<ModelDoa>();

    for (int i = 0; i < data.length; i++) {
            list.add(new ModelDoa(data[i], baca[i], ModelDoa.DOA_PAGI));
    }

    return list;
}

// Agar back button pada halaman induk settings berfungsi
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            this.finish();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

}

更新(修复代码):克里希纳·夏尔马: https://github.com/seadclark/RecyclerViewWithButtonClicks


这是修复方法。只需更新ModelDoa构造函数如下。我已经验证了自己并且现在按预期工作。还向您发送了 github 上的拉取请求.

public ModelDoa(String name, String butong, int type) {
    this.mName = name;
    this.bName = butong;
    this.mType = type;
    String[] data = butong.split("\\s");
    if (data.length > 0) {
        String count = data[1].substring(0, data[1].length() - 1);
        read10 = Integer.parseInt(count);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不删除回收者视图中的位置的情况下删除项目? 的相关文章

随机推荐

  • 如何在 Zend Framework 2 中将数据库适配器设置为 Validator RecordExists

    我正在尝试将验证器 RecordExists 添加到我的表单中 但收到错误 不存在数据库适配器 如何将数据库适配器设置为此验证器 我使用骨架应用程序中的示例 我正在尝试执行类似的操作 是的 我知道 dbAdapter 未定义 我正在搜索如何
  • 无法手动将签名的 apk 安装到设备,出现错误“应用程序未安装”

    我想将我的应用程序发布到 GooglePlay 但首先我想使用签名的 apk 进行最后一次测试 以确保所有使用的 API 密钥都能在发布版本 GMaps Facebook 等 中正常工作 所以我只是使用我们的发布密钥制作了我的应用程序的签名
  • 获取全球ip地址

    我怎样才能得到 在C 中 global我的电脑的IP地址 Windows XP 你不能 您可以确定各个接口上的 IP 地址 并且可能有多个 这些可能是局域网 IP 10 0 0 0 8 192 168 0 0 16 等 也可能是 Inter
  • 如何使用 FFmpeg hstack 过滤器合成 2 个视频?

    我想通过并排将 2 个视频合成为 1 个视频 我还希望为每个视频设置开始 停止时间 最终视频应为 H264 AAC 编解码器和 mp4 格式 我附上了示例视频 https www dropbox com s e5eouyrrqsy44ts
  • iPhone X 中的导航栏问题? [复制]

    这个问题在这里已经有答案了 当我在 iPhone X 中运行该项目时 导航栏上方出现黑色空间 如图所示 但颜色没有相同 怎么解决这个问题呢 我想您没有使用故事板作为启动屏幕 有两个选项可以解决此问题 使用故事板作为启动屏幕 如果您使用启动图
  • 如何更新 Bitnami 堆栈中的 GitLab

    我在尝试BitNami GitLab 堆栈5 1 0 2 当我这样做的时候5 1 0 3被释放了 如何更新 Bitnami 堆栈中的 GitLab 相关带 LDAP 的 BitNami GitLab Stack 5 1 0 2 看这个 ht
  • 当我复制 laravel 项目并显示最后一个视图时出错

    我有一个 Laravel 5 3 项目 它是 5 个月前创建的 今天我复制了该项目 并对代码做了一些更改 当我编辑 Blade php 文件中的视图时 我编辑的项目向我显示了最后一个项目视图 我在新的 Laravel 项目中创建了一条新路线
  • 单击工具栏上的汉堡包图标不会打开导航抽屉

    我有这个导航抽屉工作得很好 重构我的代码我删除了所有onOptionsItemSelecteds在活动中并使所有活动继承自扩展的基本活动AppComplatActivity and 实施所有必要的方法 在此之后 即使我有 单击汉堡包图标也不
  • WPF DataGrid - 我可以使用属性装饰 POCO 以获得自定义列名称吗?

    我在 WPF 中有一个 DataGrid 并用如下数据填充它 public enum Sharing Equal SurfaceBased public class Data public bool Active get set publi
  • 无法通过反射调用带有 varargs 参数的方法 - NoSuchMethodException

    我正在尝试使用反射来调用带有可变参数的方法 并抓住了NoSuchMethodException 我不明白这里出了什么问题 Code public class ReflectionTest public ReflectionTest priv
  • SwiftUI 中的 @Binding 和 ForEach

    我不明白如何使用 Binding结合ForEach在 SwiftUI 中 假设我想创建一个列表Toggles 来自布尔数组 struct ContentView View State private var boolArr false fa
  • 将当前样式表保存到本地存储

    我知道有人问过这个问题 但没有一个帖子可以帮助我解决这个问题 所以 事情是这样的 我的网站上有两个样式表 我想将最近使用的样式表保存到本地存储 样式表之间的切换效果很好 这是我的代码 window onload function var c
  • NSCache初始化用于存储ios UIImage

    我正在使用 NSCache 来存储图像 但这里的问题是一旦我在控制器之间切换 NSCache 就会清空 我希望这些项目至少在应用程序关闭或用户注销之前一直存在 假设我有一个选项卡视图 并且我将数据中的图像存储在第一个选项卡中 当我转到第二个
  • OWL-LIST 和 RDF-LIST 之间的区别

    我无法理解 OWL LIST 和 RDF LIST 之间的区别 其次 为什么OWL DL由于OWL序列化而不支持RDF LIST 以及如何在 OWL DL 中创建 OWL LIST 正如评论中提到的 我不认为有任何称为 OWL LIST 的
  • 当报告服务遇到错误时如何设置电子邮件通知

    我有一些配置为在报告服务中通过电子邮件传送的报告 昨晚我们遇到了一些网络中断 报告服务无法连接到数据库引擎 有什么方法可以配置在无法发送订阅时发送电子邮件通知吗 我正在使用报告服务 2008 R2 当电子邮件无法发送时您想要一封电子邮件吗
  • 在 MSVS C# 项目中找不到 C++/CLI DLL 命名空间(可成功重现)

    我有类似的问题在 MSVS 中找不到 C CLI DLL 命名空间 我用的是VS2010 我有一个 C CLI 程序集 DLL 其中包含有关非托管 C 代码的托管包装器 公共引用类 代码 当我从 C 项目引用此项目时 在我的实际项目中 它是
  • 如何从给定纬度和经度的地图中检索速度限制?

    我正在尝试从 Here API 地图获取速度限制 但我找不到方法 我在网站上尝试了几个示例 但唯一有效的示例是需要路线起点和终点的示例 我想获得仅给出一个点 或一个框 的速度限制 我必须使用哪个 api 有例子吗 https route c
  • Angularfire:如何查询数组中特定键的值?

    我有以下 json 对象 posts Jk3ipZ2EFgvkABHf9IX category JavaScript date 1426008529445 heading Lorem text dsvgfjds daefsrgfs defs
  • 在 Android 上使用 Facebook API 创建自定义墙贴

    我是 Android 上的 Facebook API 新手 基本上 我想做的是为我正在开发的应用程序创建自定义墙贴 就像当您听 Shazam 歌曲时 您可以与朋友分享结果 我相信我必须创建一个自定义附件 这是我设置附件的代码 mPostBu
  • 如何在不删除回收者视图中的位置的情况下删除项目?

    我真的需要你的帮助 我用很多关键词在谷歌上搜索了很多天 但我找不到 所以 我决定向你请教 所以 就在这里 实际上 我在 RecyclerView 中有一个按钮 但是这个按钮会根据可用的数据量而重复 有 带有文本 Baca 3x Baca 4