如何从Android中的listView中删除重复的项目

时间:2018-10-19 06:34:20

标签: android listview arraylist android-arrayadapter

我需要用listview的自定义元素填充我的arraylist。在尝试从我的API获取它之前,我创建了一个虚拟的arraylist,具有不同的值以应用于适配器。我在此处输入的元素数量为六个。问题在于,第四位之后的元素重复标题(这是我的自定义对象的唯一变量),并从头开始重新启动它。 结果列表不是1-2-3-4-5-6而是1-2-3-4-1-2。

我的自定义适配器

public class librettoAdapter extends ArrayAdapter<librettoDTO> {

Context context;

public librettoAdapter(Context context, int risorsaId,
                          List<librettoDTO> items) {
    super(context, risorsaId, items);
    this.context = context;
}


//metodo getView --> ritorna la view da inserire nella ListView

public View getView(int position, View convertView, ViewGroup parent) {

    //controllo se c'è gia un layout
    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.libretto_element, null);

        librettoDTO content = getItem(position);

        TextView textTitolo = convertView.findViewById(R.id.nome_materia);
        textTitolo.setText(content.getTitolo());

    }
    return convertView;
}

}

填充列表视图

   inputItems = new ArrayList<librettoDTO>();

    /** RITORNA LA CHIAAMATA*/
    /** SOTITUIRE CON LIBRETTODTO */
    /* FACCIAMO FINTA CHE SIA IL RISULTATO DELA CHIAMATA */
    librettoDTO source1 = new librettoDTO("titolo1");
    librettoDTO source2 = new librettoDTO("titolo2");
    librettoDTO source3 = new librettoDTO("titolo3");
    librettoDTO source4 = new librettoDTO("titolo4");
    librettoDTO source5 = new librettoDTO("tsdasdadssa");
    librettoDTO source6 = new librettoDTO("6666666");

    inputItems.add(source1);
    inputItems.add(source2);
    inputItems.add(source3);
    inputItems.add(source4);
    inputItems.add(source5);
    inputItems.add(source6);



    contentItems = new ArrayList<librettoDTO>();

    for (int i = 0; i < inputItems.size(); i++) {

        //librettoDTO item = new librettoDTO(titoli[i]); //INIT DTO GET FROM ARRAY LIST
        librettoDTO item = inputItems.get(i);
        contentItems.add(item);

        //setto la listview e istanzio l'adapter che si prende lo stile xml e l'arraylist di content

        librettoAdapter adapter = new librettoAdapter(getContext(),
                R.layout.libretto_element, contentItems);


        listView = (ListView) v.findViewById(R.id.libretto_listview);
        listView.setAdapter(adapter);
        //setto il listener
        //listView.setOnItemClickListener(this);
    }

3 个答案:

答案 0 :(得分:0)

使用RecyclerView 像这样更改适配器

适配器 librettoAdapter.class

public class librettoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List inputItems;

    public librettoAdapter(List<String> inputItems) {
        this.inputItems = inputItems;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        context = parent.getContext();
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_text, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        String text = inputItems.get(position);
        textview.settext(text);
    }

    @Override
    public int getItemCount() {
        return this.inputItems.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.textview)
        TextView textview;

        public ViewHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);

        }
    }
}
  

将项目设置为list

inputItems = new ArrayList<librettoDTO>();

/** RITORNA LA CHIAAMATA*/
/** SOTITUIRE CON LIBRETTODTO */
/* FACCIAMO FINTA CHE SIA IL RISULTATO DELA CHIAMATA */
librettoDTO source1 = new librettoDTO("titolo1");
librettoDTO source2 = new librettoDTO("titolo2");
librettoDTO source3 = new librettoDTO("titolo3");
librettoDTO source4 = new librettoDTO("titolo4");
librettoDTO source5 = new librettoDTO("tsdasdadssa");
librettoDTO source6 = new librettoDTO("6666666");

inputItems.add(source1);
inputItems.add(source2);
inputItems.add(source3);
inputItems.add(source4);
inputItems.add(source5);
inputItems.add(source6);

librettoAdapter = new librettoAdapter(keyList,valuesList);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(librettoAdapter);


如果仍然要使用listview,请尝试删除if (convertView == null)条件。

答案 1 :(得分:0)

已解决:刚刚评论了convertView的检查

include "conn.php";

$maketemp = "
    CREATE TEMPORARY TABLE temp_table_1 (
        `idarea` int NOT NULL,
        `kode` varchar(20),
        PRIMARY KEY(idarea) 
    )
"; 
mysql_query($maketemp, $connect) or die ("Sql error : ".mysql_error());

$inserttemp = "
    INSERT INTO temp_table_1 (`idarea`, `kode`)
    SELECT `id_areasf`, `kd_areasf` FROM `areasf`
";
mysql_query($inserttemp, $connect) or die ("Sql error : ".mysql_error());

$select = "SELECT * FROM temp_table_1";
$export = mysql_query($select, $connect) or die ("Sql error : ".mysql_error());

答案 2 :(得分:0)

Android Listview使用缓存进行视图绑定。例如,如果您的屏幕仅覆盖4个项目,则要进行绑定5。item listview使用cache中的一项。在四个getview调用中,视图将为null,您将对其进行夸大。但是对于5. item,由于缓存的使用,它可能不会为null。在您的示例中,listview使用了缓存中的第一项来绑定5. item,而if(convertView == null)的内部将不会运行。 5.项目。

更改为:

 LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.libretto_element, null);
    }

   librettoDTO content = getItem(position);
   TextView textTitolo = convertView.findViewById(R.id.nome_materia);
   textTitolo.setText(content.getTitolo());

    return convertView;