0

во-первых, большое спасибо всем экспертам, которые отвечают на вопросы и обеспечивают понимание проблем. Ваша работа приветствуется.
Теперь я новичок и только начал использовать java и Android .... но я люблю его. во-вторых,
простите мой код. это мое первое Android-приложение ... переход от 13yrs vb и vba :), и большая часть его изменяется от пользовательских вопросов здесь, в stackoverflow.Gridview с использованием пользовательского адаптера не отображает все результаты

Фон:
У меня есть gridview, что я хочу отображать контактные данные (имя и номер) из журнала вызовов.
Чтобы избежать дублирования чисел, я прокручиваю курсор и сравниваю номера телефонов, конечно, сортируя входящие данные курсора по CallLog.Calls.NUMBER + «ASC»;

Я также создал свой собственный класс (ContactObj), который содержит имя, номер и идентификатор контакта, и я передаю этот класс в ArrayList. в конце концов, я передаю этот ArrayList к пользовательскому адаптеру, который использует развёртывание макета для заполнения сетки.

Вопрос:
По какой-то причине программа работает нормально, но первые десять контактов повторяются снова и снова. то есть. общее количество контактов в моем журнале телефона 113 уникальных. однако сетка отображает только первые 10 и более на общую сумму 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

ответ

0

txtContactName.setText (mItems.get (положение) .getContactName());

Эти утверждения должны быть вне условия if. Также проверьте один раз viewholder usage.

Возможно, вы получите решение.

Смежные вопросы