[英]Gridview using custom adapter not displaying all results
首先,感谢所有回答问题并提供对挑战的见识的专家。 感谢您的工作。
现在,我是一个新手,刚开始使用Java和Android。...但我很喜欢它。 其次,
请原谅我的代码。 它是我的第一个Android应用程序...从13岁的vb和vba移走:),其中许多内容是根据stackoverflow上的用户问题进行了修改的。
背景:
我有一个gridview,我想显示呼叫记录中的联系人数据(姓名和电话号码)。
为了消除重复的号码,我当然会遍历光标,然后比较电话号码,然后按CallLog.Calls.NUMBER +“ ASC”对传入的光标数据进行排序;
我还创建了自己的类(ContactObj),该类包含联系人的姓名,电话号码和ID,并将该类传递给ArrayList。 最终,我将此ArrayList传递给自定义适配器,该适配器使用布局填充器填充网格。
问题:
由于某种原因,该程序运行正常,但是前十个联系一遍又一遍地重复。 即。 我的电话日志中的总联系人为113个唯一。 但是,网格仅显示前113个,一共一个。
问题:
也许此时的“老手”可以指出我出了问题的地方? 我猜这与我的实现提供给gridview的自定义适配器有关。
在我调试时,注意到mChildrenCount的值固定为11,这是设计模式下gridview中单元的计数。 由于某种原因,只要达到此数字,gridview就会再次从0开始,并重复数据。 似乎我缺少一些设置来允许网格超出设计期间显示的单元格。 ...有人有什么想法吗? 谢谢。
这是主要活动的代码
public class CallLogActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridview);
final Context myContext = CallLogActivity.this;
final CustomAdapter mAdapter;
ArrayList<ContactObj> arrToPassToGrid = new ArrayList<ContactObj>();
String strNameHolder = "";
String strCurrentName;
String strNumber;
String strCallDate;
String ID;
int i = 0;
int ComparisonResult;
// first find the grid
GridView callLogGrid = (GridView) findViewById(R.id.callLogGrid);
// next get the contents to display
Long yourDateMillis = System.currentTimeMillis()- (30 * 24 * 60 * 60 * ' `1000);
Time yourDate = new Time();
yourDate.set(yourDate);
String[] YourDateMillistring = {String.valueOf(yourDateMillis)};
String formattedDate = yourDate.format("%Y-%m-%d %H:%M:%S");
Time tempDate;
Cursor Tempcursor;
Cursor cursor;
cursor = getContentResolver().query(CallLog.Calls.CONTENT_URI,
new String[]{CallLog.Calls._ID,
CallLog.Calls.CACHED_NAME,
CallLog.Calls.NUMBER,
CallLog.Calls.DATE},
null,
null,
CallLog.Calls.NUMBER + " ASC");
startManagingCursor(cursor);
// intialize nameholder ----will be used to remove duplicate names in
strNameHolder = "";
if (cursor.moveToFirst()) {
while (cursor.moveToNext()) {
// place contents in variables for easier reading later on;
strCurrentName =
cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME));
strNumber = cursor.getString(
cursor.getColumnIndex(CallLog.Calls.NUMBER)).trim();
strCallDate = cursor.getString(cursor.getColumnIndex(CallLog.Calls.DATE));
ID = cursor.getString(cursor.getColumnIndex(CallLog.Calls._ID));
if (strCurrentName == null && strNumber == null) {
ComparisonResult = 0;
} else {
ComparisonResult = strNameHolder
.compareToIgnoreCase(strNumber);
}
if (ComparisonResult != 0) {
ContactObj contList = new ContactObj();
contList.setIndex(i);
contList.setContactName(strCurrentName);
contList.setContactDialledNumber(strNumber);
contList.setContact_ID(ID);
contList.setCallDate(strCallDate);
arrToPassToGrid.add(i, contList);
i++;
}
strNameHolder = cursor.getString(
cursor.getColumnIndex(CallLog.Calls.NUMBER)).trim();
};
};
try {
// Collections.sort(arrToPassToGrid)
mAdapter = new CustomAdapter(this, arrToPassToGrid);
callLogGrid.setAdapter(mAdapter);
} catch (Exception e)
{
Log.d("Kush", e.getMessage());
e.printStackTrace();
}
}
此代码是我的自定义适配器
public class CustomAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<ContactObj> mItems;
public CustomAdapter(Context c, ArrayList<ContactObj> items)
{
mContext = c;
mItems = items;
}
public int getCount()
{
return mItems.size();
}
public Object getItem(int position)
{
return mItems.get(position);
}
public long getItemId(int position)
{
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater li = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.calllog_layout, null);
Log.d("Kush",String.valueOf(getCount()));
TextView txtContactName = (TextView)v.findViewById(R.id.txtContactName);
txtContactName.setText(mItems.get(position).getContactName() );
TextView txtNumber = (TextView)v.findViewById(R.id.txtContactNumber);
txtNumber.setText(mItems.get(position).getContactDialledNumber());
TextView txtDate = (TextView)v.findViewById(R.id.txtCallDate);
txtNumber.setText(String.valueOf(position) );
}
return v;
}
public static String getDate(long milliSeconds, String dateFormat)
{
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(milliSeconds);
return formatter.format(calendar.getTime());
}
}
这是保存联系方式的对象
public class ContactObj {
private String ContactName;
private String ContactDialledNumber;
private String Contact_ID;
private String CallDate;
public final String getCallDate()
{
return CallDate;
}
public final void setCallDate(String callDate)
{
CallDate = callDate;
}
private int index;
// @return the contactName
public final String getContactName()
{
return ContactName;
}
// @param contactName the contactName to set
public final void setContactName(String contactName)
{
ContactName = contactName;
}
//@return the contactDialledNumber
public final String getContactDialledNumber()
{
return ContactDialledNumber;
}
//@param contactDialledNumber the contactDialledNumber to set
public final void setContactDialledNumber(String contactDialledNumber)
{
ContactDialledNumber = contactDialledNumber;
}
//@return the contact_ID
public final String getContact_ID()
{
return Contact_ID;
}
// @param contact_ID the contact_ID to set
public final void setContact_ID(String contact_ID)
{
Contact_ID = contact_ID;
}
//@return the index
public final int getIndex()
{
return index;
}
//@param index the index to set
public final void setIndex(int index)
{
this.index = index;
}
}
最后的GridView和布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="center_horizontal"
android:id="@+id/GridItem"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/grid_item_image"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:scaleType="centerCrop" />
<TextView
android:gravity="center_horizontal"
android:id="@+id/txtContactName"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/contactName"
android:textColor="#000000" />
<TextView
android:gravity="center_horizontal"
android:id="@+id/txtContactNumber"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/contactNumber"
android:textColor="#000000" />
<TextView
android:gravity="center_horizontal"
android:id="@+id/txtCallDate"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/CallDate"
android:textColor="#000000" />
</LinearLayout>
和Gridview
txtContactName.setText(mItems.get(position).getContactName());
这些语句应在if条件之外。 还要检查一次观看者的使用情况 。
可能您会找到解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.