如何将一个变量从OnCreate传递给OnListItemClick而不在android中全局声明它?

时间:2016-06-27 07:25:42

标签: java android

java文件:屏幕变量的问题〜我在OnListItemClick方法中需要它,但只在执行游标操作并将值赋给tpid之后。我尝试声明公开没有帮助的两种方法。此外,我尝试在单独的类中执行数据库操作,但是当我通过按钮OnClick从片段调用此活动时,它显示错误,即使在将ListActivity扩展到新类之后也无法将新类强制转换为ListActivity类型。

package utkarsh.project1;
import android.app.Application;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;


public class ViewActivity extends ListActivity {


    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view);
        SQLiteDatabase db=openOrCreateDatabase("exp",MODE_APPEND,null);
        TableRow tr;
        String q="Select TripID from exp";
        Cursor c=db.rawQuery(q,null);
        String tpid="";
        while(c.moveToNext())
        {
            tpid=c.getString(0)+",";
        }
        db.close();
        String screens[]={tpid};
        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1,screens);
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        if(screens[position].equals("EXIT"))
        {
            finish();
        }
        else
        {
            Toast.makeText(this, "Clicked on: " + screens[position], Toast.LENGTH_SHORT).show();
            String str="utkarsh.project1."+screens[position];
            try
            {
                Class c= Class.forName(str);
                Intent i = new Intent(this,c);
                startActivity(i);
            }
            catch (Exception e)
            {
                Toast.makeText(this,"Screen not yet designed",Toast.LENGTH_SHORT);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您可以在listView上设置 onClickListener ,而不是扩展 listActivity 只需扩展活动,然后在的onCreate()

ListView listview1 = (ListView) findViewById(R.id.listview1);
listview1.setOnItemClickListener(
        new OnItemClickListener()
        {

            @Override
            public void onItemClick(AdapterView<?> arg0, View view,
                    int position, long id) {
               *//Do whatever you want here* 
            }   
        }       
);

答案 1 :(得分:0)

您可以使用getItem(int position)类的Adapter方法获取所选值。您不需要访问screens变量,因为它已经用于支持数据适配器。

答案 2 :(得分:0)

你有很多错误......

  • ArrayAdapter基本逻辑:构造函数ArrayAdapter(Context context, int item_layout, T[] objects)表示:适配器/列表视图中的每个项目都具有布局item_layout,并且必须包含TextView,其ID为@android:id/text1 1}} ArrayAdapter的内部代码所需要的。您可以使用Complext布局并通过其他构造函数指定TextView id,例如ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects),您可以在其中使用Complext布局但必须具有ID为TextView的{​​{1}}。 textViewResourceId的每个元素都绑定到适配器中的相应项,并且适配器项中的objects设置为TextView的文本。
  • 您的代码的第一个错误是,objects[index].toString()您使用onCreate作为纯文本字符串screens,这是"id1,id2,id3,..."无法理解的。根据上述逻辑,您的ArrayAdapter应该是一个字符串数组,如screens
  • 因为["id1", "id2", "id3", ...]绑定到适配器项,您可以通过screensonItemClickListener中获取字符串。
  • 主要错误是您在主线程中调用数据库查询...考虑将代码从String screenItemText = ((TextView) view.findViewById(android.R.id.text1)).getText();移动到SQLiteDatabase db=openOrCreateDatabase("exp",MODE_APPEND,null);到后台线程。 String screens[]=xxxx;是一种简单而有效的解决方案。