Неожиданное поведение набора данных в Android GridView, когда мобильное устройство. - PullRequest
0 голосов
/ 22 октября 2011

Вот моя реализация GridView для приложения Android.Для программы «Первый раз» она работает хорошо. Но после некоторой прокрутки вверх и вниз Моя проблема в том, что когда в режиме просмотра сетки я прокручиваю его, я иногда помещаю неправильный текст в неожиданное положение.

Мой исходный код для адаптера GridView следующий.

   @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mGridView=(GridView)findViewById(R.id.gridview_id);
    InitializeVariable();
    mGridView.setAdapter(new GridAdapter(GridViewExampleActivity.this));
    mGridAdapter=new GridAdapter(GridViewExampleActivity.this);
   // mGridView.setEnabled(false);
    mGridView.setOnLongClickListener(this);
    mGridView.setOnItemClickListener(this);

}

    public class GridAdapter extends BaseAdapter{
    public  Context mContext_GridAdapter=getApplicationContext();

    GridAdapter(Context context){
        this.mContext_GridAdapter=context;
    }

    @Override
    public int getCount() {

        return Fix_Grid_View;
    }

    @Override
    public Object getItem(int position) {

        return position;
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        RelativeLayout mRelative_Box_Grid;
        TextView mTextView;
        View v;
        if(convertView==null){
            mLayoutInflater=LayoutInflater.from(GridViewExampleActivity.this);
            v=mLayoutInflater.inflate(R.layout.relative_box_view, null);
            mTextView=(TextView)v.findViewById(R.id.txt_number);
            mRelative_Box_Grid=(RelativeLayout)v.findViewById(R.id.relative_view);
            mRelative_Box_Grid.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT,Device_Height));
            mRelative_Box_Grid.setPadding(2, 2, 2, 2);
            mTextView.setTextSize(Fix_Text_Size);
            mTextView.setText(String.valueOf(position));
            mTextView.setId(position);

        }else{
            v=convertView;
        }
        return v;
    }

}

Вот мой основной xml-файл

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<GridView android:numColumns="3" 
    android:stretchMode="columnWidth"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:id="@+id/gridview_id"
    android:longClickable="true"
    ></GridView>
 </LinearLayout>

Я поместил тот же файл main.xml в res / layout-land для ландшафтного режима.

и я также добавилэта строка в моем файле AndroidManifest для изменения дескриптора ориентации

android:configChanges="orientation"

, и я также реализую, когда мы щелкаем по любому элементу в той позиции, что TextView ушел за невидимым здесь, является кодом для этого.

    @Override
public void onItemClick(AdapterView<?> AdapterView, View view, int position, long arg3) {

    int Child_Count;
    RelativeLayout mRelativeLayout;
    TextView mTextView;

    try{
        Toast.makeText(GridViewExampleActivity.this, "Position "+ position, 600).show();
        Child_Count=AdapterView.getChildCount();
        mRelativeLayout=(RelativeLayout) AdapterView.getChildAt(position);
        mTextView=(TextView) mRelativeLayout.getChildAt(0);
        mTextView.setVisibility(View.INVISIBLE);
       // mGridAdapter.notifyDataSetChanged();
       // mGridView.setAdapter(mGridAdapter);
        Log.v(TAG, "Child Count is"+ Child_Count);
    }catch(Exception e){
        Log.v("log", " Mes"+TAG +e.getMessage());
    }


}

эта функция работает хорошо, но не работает в течение некоторого времени после изменения ориентации в моем эмуляторе с помощью клавиш Ctrl + F11.Вот мой xml-файл Inflater View.

 <?xml version="1.0" encoding="utf-8"?>
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" 
android:background="@drawable/rectangle_white"
android:id="@+id/relative_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:text="@string/hello"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:id="@+id/txt_number"/>
   </RelativeLayout>

Здесь я прилагаю справочное изображение моего демонстрационного приложения для задачи, которую я получаю.

enter image description here

For landscape

Посмотрите на первое изображение, когда i Прокрутите вверх и вниз значение обмена Textview. Неожиданно

, и когда такое же изменение в альбомной ориентации мобильного Android, оно некоторое время начинается с 11, что не должно происходить таким образом.

Ответы [ 2 ]

1 голос
/ 22 октября 2011

В вашем Adapter попробуйте переместить эти строки:

mTextView=(TextView)v.findViewById(R.id.txt_number);
mTextView.setText(String.valueOf(position));

находиться чуть выше вашего оператора возврата:

return v;

Кроме того, я не уверен, но я не думаю, что вам нужна строка mTextView.setId(position);, поскольку позиция представления указывается в обратном вызове onClick.

0 голосов
/ 22 октября 2011

На первый взгляд, я замечаю следующее:

mGridView=(GridView)findViewById(R.id.gridview_id);
InitializeVariable();
mGridView.setAdapter(new GridAdapter(GridViewExampleActivity.this));
mGridAdapter=new GridAdapter(GridViewExampleActivity.this);

Почему вы создаете два адаптера Grid?Я думаю, вам нужен только один из них:

mGridView=(GridView)findViewById(R.id.gridview_id);
InitializeVariable();
// Create the GridAdapter
mGridAdapter=new GridAdapter(GridViewExampleActivity.this);
// Set the Adapter tp the gridview
mGridView.setAdapter(mGirdAdapter);

Более того, взгляните на ваш код для метода getView Адаптера.Android будет стараться использовать как можно больше просмотров.Вы создаете только свои представления, когда convertView == null, например, только для первых заполненных представлений.

После прокрутки Android попытается повторно использовать эти представления.Следовательно, convertView не будет нулевым, и код, который устанавливает текст в представлениях, не выполняется.Изменить на это:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    RelativeLayout mRelative_Box_Grid;
    TextView mTextView;
    View v;

    // Assign the re-usable view to v
    v = convertView;

    if(v==null){
        // Create views if v == null
        mLayoutInflater=LayoutInflater.from(GridViewExampleActivity.this);
        v=mLayoutInflater.inflate(R.layout.relative_box_view, null);

        // NOTE: This will only be executed for the Views that will be
        // visible initially (so, for 0 through 11)
    }

    // Setup your view to show the proper values
    // NOTE: This will always be executed
    mTextView=(TextView)v.findViewById(R.id.txt_number);
    mRelative_Box_Grid=(RelativeLayout)v.findViewById(R.id.relative_view);
    mRelative_Box_Grid.setLayoutParams(new GridView.LayoutParams(GridView.AUTO_FIT,Device_Height));
    mRelative_Box_Grid.setPadding(2, 2, 2, 2);
    mTextView.setTextSize(Fix_Text_Size);
    mTextView.setText(String.valueOf(position));
    mTextView.setId(position);

    return v;
}

Удачи

...