Android GridView中的非预期数据集行为移动时更改为陆地到端口或端口着陆

时间:2011-10-22 13:15:51

标签: android gridview scrollview

这是用于Android应用程序的My GridView工具。 对于程序第一次它运作良好。但是在进行一些向上和向下滚动之后 我的问题是在gridview中我滚动它一段时间将错误的textview放在意想不到的位置。

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中用于Landscape模式。

我还在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键在我的仿真器中进行一些方向更改后失败了一段时间。 这是我的Inflater View xml文件。

 <?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

当我向上和向下滚动Textview的值时,请查看第一张图像。意外

当Android移动版的横向视图发生相同变化时,从11开始就不应该以这种方式发生。

2 个答案:

答案 0 :(得分:1)

Adapter中,尝试移动这些行:

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

高于你的退货声明:

return v;

此外,我不确定,但我认为您不需要第mTextView.setId(position);行,因为onClick回调中提供了视图的位置。

答案 1 :(得分:0)

乍一看,我注意到以下几点:

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

为什么要创建两个GridAdapter? 我认为你只需要这样一个:

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不会为null,并且不会执行在视图中设置文本的代码。改为:

@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;
}
祝你好运