Android 如何实现具有重复项的ListView?
我正在尝试创建一个包含已知项的列表视图。所有项目都已在ArrayList中 我在onScrollListener(onScroll方法)中跟踪触底情况并这样做Android 如何实现具有重复项的ListView?,android,listview,Android,Listview,我正在尝试创建一个包含已知项的列表视图。所有项目都已在ArrayList中 我在onScrollListener(onScroll方法)中跟踪触底情况并这样做 if(firstVisibleItem + visibleItemCount >= totalItemCount) // move first item to end of arraylist 问题是;当滚动在底部时,新添加的项目会立即显示。我想做的是在屏幕上保持相同的可见项。仅在滚动时显示新项目 我只想重复相同的项目,但
if(firstVisibleItem + visibleItemCount >= totalItemCount)
// move first item to end of arraylist
问题是;当滚动在底部时,新添加的项目会立即显示。我想做的是在屏幕上保持相同的可见项。仅在滚动时显示新项目
我只想重复相同的项目,但无法理解。列表滚动到位置
totalItemCount
。如果您只是更改列表中项目的顺序,使第一个项目位于末尾,它将显示新的顺序,但保留位置,因此您将继续看到最后一个项目-无论现在是什么
听起来你想要的是一个循环滚动列表视图。尝试此解决方案:基本上,您可以在活动中实现一个简单的listView,但使用您自己创建的特殊BaseAdapter(从BaseAdapter扩展而来) 您可以使用以下内容作为列表的第二个参数:
package com.example.joignabilite;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class ContactAdapter extends BaseAdapter {
// The list of contact
private List<Contact> mListP;
//COntexte of the adapter
private Context mContext;
//Mecanism to manage graphism from xml file
private LayoutInflater mInflater;
private int white = 0xFFFFFFFF;
private int grey = 0x33000000;
public ContactAdapter(Context context, List<Contact> aListP) {
mContext = context;
mListP = aListP;
mInflater = LayoutInflater.from(mContext);
}
public int getCount() {
return mListP.size();
}
public Object getItem(int position) {
return mListP.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout layoutItem;
//(1) : Réutilisation des layouts
if (convertView == null) {
//Initialisation de notre item à partir du layout XML "Contact_layout.xml"
layoutItem = (LinearLayout) mInflater.inflate(R.layout.item_contact, parent, false);
} else {
layoutItem = (LinearLayout) convertView;
}
//(2) : Récupération des TextView de notre layout
TextView tv_Nom = (TextView)layoutItem.findViewById(R.id.repertoire_item);
//(3) : Renseignement des valeurs
tv_Nom.setText(mListP.get(position).nom);
//On mémorise la position de la "Contact" dans le composant textview
tv_Nom.setTag(position);
if(position % 2 == 0)
layoutItem.setBackgroundColor(grey);
else
layoutItem.setBackgroundColor(white);
//On ajoute un listener
tv_Nom.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Lorsque l'on clique sur le nom, on récupère la position du "Contact"
Integer position = (Integer)v.getTag();
//On prévient les listeners qu'il y a eu un clic sur le TextView "TV_Nom".
sendListener(mListP.get(position), position);
}
});
//On retourne l'item créé.
return layoutItem;
}
/**
* Interface pour écouter les évènements sur le nom d'une Contact
*/
public interface ContactAdapterListener {
public void onClickNom(Contact item, int position);
}
//Contient la liste des listeners
private ArrayList<ContactAdapterListener> mListListener = new ArrayList<ContactAdapterListener>();
/**
* Pour ajouter un listener sur notre adapter
*/
public void addListener(ContactAdapterListener aListener) {
mListListener.add(aListener);
}
private void sendListener(Contact item, int position) {
for(int i = mListListener.size()-1; i >= 0; i--) {
mListListener.get(i).onClickNom(item, position);
}
}
}
package com.example.joignabilite;
导入java.util.ArrayList;
导入java.util.List;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.LinearLayout;
导入android.widget.TextView;
公共类ContactAdapter扩展了BaseAdapter{
//联系人名单
私人名单;
//适配器的COntexte
私有上下文;
//从xml文件管理图形的机制
私人停车场;
私有int-white=0xFFFFFFFF;
专用int灰色=0x33000000;
公共ContactAdapter(上下文,列表aListP){
mContext=上下文;
mListP=aListP;
mInflater=LayoutInflater.from(mContext);
}
public int getCount(){
返回mListP.size();
}
公共对象getItem(int位置){
返回mListP.get(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
线性布局布局项目;
//(1) :Ré布局的利用率
if(convertView==null){
//初始化notre项目作为布局XML的一部分“Contact_layout.XML”
layoutItem=(LinearLayout)mInflater.充气(R.layout.item_contact,parent,false);
}否则{
layoutItem=(LinearLayout)转换视图;
}
//(2) :Récupération des TextView de notre布局
TextView tv_Nom=(TextView)layoutItem.findviewbyd(R.id.repertoire_项);
//(3) :瓦卢尔重新签署
tv_Nom.setText(mListP.get(position.Nom));
//在mémorise la position de la“Contact”dans le composant textview上
电视名称设置标签(位置);
如果(位置%2==0)
layoutItem.setBackgroundColor(灰色);
其他的
layoutItem.setBackgroundColor(白色);
//关于一个联合国听者
电视名称setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//Lorsque l'on集团在勒诺,关于“接触”的立场
整数位置=(整数)v.getTag();
//在“电视名称”文本视图上的欧盟联合国气候变化委员会(eu un clic)。
sendListener(mListP.get(position),position);
}
});
//关于重述“cré项目”。
返回布局项;
}
/**
*接触点名称上的电气设备接口
*/
公共接口接触器适配器侦听器{
公共void onClickNom(联系人项目,内部位置);
}
//继续收听听众
private ArrayList mListListener=new ArrayList();
/**
*将外部监听器倒在适配器上
*/
public void addListener(ContactAdapterListener Alitener){
mListListener.add(alitener);
}
私有void sendListener(联系人项目,int位置){
对于(int i=mListListener.size()-1;i>=0;i--){
mListListener.get(i).onClickNom(项目、位置);
}
}
}
您可以将其放置在可见位置,也可以不使用位置部分。谢谢,我要找的是“圆形”这个词:)