Question

J'ai un ListView qui remplit les données d'une base de données dans un ListView complexe.Une chaîne dans la colonne 'gotoURL' de la base de données est une URL pour charger un lien dans une WebView à l'aide de l'intention putExtra.Lorsque je clique sur un ListItem pour passer à l'activité suivante, ma méthode saisit les données de chaîne correctes, mais elle extrait la chaîne de la mauvaise ligne de base de données.Selon mon 'log.i (...);'indique dans le DDMS, la ligne id correcte est sélectionnée mais la chaîne de la colonne est extraite de l'ID de première ligne et non de l'ID de ligne sélectionné (???) - il le fait sur n'importe quel ListItem sélectionné.

Je ne sais pas comment écrire ceci pour fonctionner correctement.Aide Plz avec un exemple de code.Merci.

Mon activité:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.list_view2);

    activityTitle = (TextView) findViewById(R.id.titleBarTitle);
    activityTitle.setText("ADVISORY CIRCULATORS");

    displayResultList();

    final ListView lv = getListView();
    lv.setTextFilterEnabled(true);
    lv.setClickable(true);

    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> a, View v, int pos,
                long id) {

            String url = "";
            lv.getItemIdAtPosition(pos);
            TextView tv = (TextView) lv.findViewById(R.id.dummy);
            url = (String) tv.getTag();

            LLog.i("tag", "ID:" + id + "URL: " + url + " selected");
            Intent i = new Intent(List_AC.this, DocView.class);
            i.putExtra("url", url);
            startActivity(i);
        }
    });
}

private void displayResultList() {

    if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_MOUNTED)) {
        extStorageDirectory = Environment.getExternalStorageDirectory()
                .toString();

        File dbfile = new File(extStorageDirectory
                + "/Aero-Technologies/flyDroid/dB/flyDroid.db");

        SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,
                null);

        Cursor databaseCursor = db.rawQuery(
                "SELECT * FROM AC_list ORDER BY `label` ASC", null);

        Adapter_AC databaseListAdapter = new Adapter_AC(this,
                R.layout.list_item, databaseCursor, new String[] { "label",
                        "title", "description", "gotoURL" }, new int[] {
                        R.id.label, R.id.listTitle, R.id.caption,
                        R.id.dummy });

        databaseListAdapter.notifyDataSetChanged();
        this.setListAdapter(databaseListAdapter);

        } else if (android.os.Environment.getExternalStorageState().equals(
            android.os.Environment.MEDIA_UNMOUNTED)) {
            Log.i("tag", "SDCard is NOT writable/mounted");
            Alerts.sdCardMissing(this);
        }
    }
}

Mon adaptateur:

public class Adapter_AC extends SimpleCursorAdapter {


static Cursor dataCursor;
private LayoutInflater mInflater;

public Adapter_AC(Context context, int layout, Cursor dataCursor,
        String[] from, int[] to) {
    super(context, layout, dataCursor, from, to);
    this.dataCursor = dataCursor;
    mInflater = LayoutInflater.from(context);
}

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);

        holder = new ViewHolder();
        holder.text1 = (TextView) convertView.findViewById(R.id.label);
        holder.text2 = (TextView) convertView.findViewById(R.id.listTitle);
        holder.text3 = (TextView) convertView.findViewById(R.id.caption);
        holder.text4 = (TextView) convertView.findViewById(R.id.dummy);

        holder.text4.setVisibility(View.GONE);

        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    dataCursor.moveToPosition(position);

    int label_index = dataCursor.getColumnIndex("label");
    String label = dataCursor.getString(label_index);

    int title_index = dataCursor.getColumnIndex("title");
    String title = dataCursor.getString(title_index);

    int description_index = dataCursor.getColumnIndex("description");
    String description = dataCursor.getString(description_index);

    int goto_index = dataCursor.getColumnIndex("gotoURL");
    String gotoURL = dataCursor.getString(goto_index);

    holder.text1.setText(label);
    holder.text2.setText(title);
    holder.text3.setText(description);
    //holder.text4.setText(gotoURL);
    holder.text4.setTag(gotoURL);

    return convertView;
}

static class ViewHolder {
    TextView text1;
    TextView text2;
    TextView text3;
    TextView text4;
}

}
Était-ce utile?

La solution

OK, votre onItemClick a quelques problèmes (voir les commentaires en ligne):

 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> a, View v, int pos,
                long id) {

            String url = "";
            lv.getItemIdAtPosition(pos); //you're never storing this value, but that's not the problem


            //This "lv" is the main problem: you're asking the LISTVIEW for the TextView
            //That's why you always get the first one. You should be asking the current view (v) instead
            TextView tv = (TextView) lv.findViewById(R.id.dummy); 
            url = (String) tv.getTag();

            LLog.i("tag", "ID:" + id + "URL: " + url + " selected");
            Intent i = new Intent(List_AC.this, DocView.class);
            i.putExtra("url", url);
            startActivity(i);
        }
    });

Cependant, pourquoi essayez-vous d'utiliser les données du support au lieu d'obtenir le tiem de sauvegarde?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top