Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
vindigo
20 / 20 / 3
Регистрация: 15.05.2014
Сообщений: 80
#1

Получить доступ к TextView внутри ListView - Программирование Android

19.03.2015, 16:34. Просмотров 811. Ответов 11
Метки нет (Все метки)

Привет, форумчане! Сначала кратко(потребуется код выложу, просто нужно понять принцип):
Есть Активити на базе ЛистАктивити, в ней ЛистВью с кастомным адаптером на базе БазовогоАдаптера, к которому, в свою очередь прикручена кастомная разметка пункта ЛистВью. Наполняется все с помощью SQLite. Разметка содержит несколько ТекстВью.
Проблема: при нажатии на пункт нужно перейти в другую Активити, и как-то передать ID, но не пункта, а именно из БАЗЫ, т.к. ID строки из базы может не совпадать с ID пункта. На основании полученного ID следующая Активити заполняет форму чтения/редактирования, опять же из базы. Вот интересует момент, как мне хотя бы получить текст из ТекстВью, по которому можно обратиться к базе и получить ID. Может есть решение проще? Я новичок, к тому же еще и самоучка.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2015, 16:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Получить доступ к TextView внутри ListView (Программирование Android):

Получить количество строк в TextView (ListView) - Программирование Android
привет всем. уже очень давно никак не могу получить количество строк в TextView который находится в ListView. каждый итем - TextView. ...

Получить текст из одного TextView в кастомном ListView - Программирование Android
Есть кастомный ListView, в котором есть картинка и два TextView, как при нажатии на элемент этого списка получить текст допустим второго...

Получить доступ к ImageView в одном конкретном элементе ListView - Программирование Android
Есть layout элемента ListView <?xml version="1.0" encoding="utf-8"?> <LinearLayout...

TextView в элементе ListView - Программирование Android
Имеется ListView, у него как положена имеется кастомный адаптер с довольно усложненной логикой. При нажатии на одном из пунктов содержимое...

ListView с несколькими TextView - Программирование Android
Как сделать более одного TextView в одном элементе ListView, и как к ним обращаться ?

Смена TextView в ListView - Программирование Android
Суть: есть каталог товаров, список заполняется через ListView из базы.. с этим все в порядке, но есть задача следующего характера: у нас...

11
YuraAAA
1578 / 1319 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
19.03.2015, 16:43 #2
vindigo, показывайте BaseAdapter реализацию. В крайнем случае можно через setTag(id) и getTag реализовать
0
vindigo
20 / 20 / 3
Регистрация: 15.05.2014
Сообщений: 80
19.03.2015, 16:46  [ТС] #3
Если я правильно понял, то код адаптера вот:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.gladyreff.mafcon;
 
import java.util.ArrayList;
import java.util.HashMap;
 
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
 
public class MafAd extends BaseAdapter {
    
    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;
    
 
    public MafAd(Activity a, ArrayList<HashMap<String, String>> contactList, int xmlLayId) {
        activity = a;
        data = contactList;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        
        
        // TODO Auto-generated constructor stub
    }
 
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.size();
    }
 
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }
 
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        
        View vi = convertView;
        if(convertView == null) 
            
            vi = inflater.inflate(R.layout.klient_list_item, null);
            
            TextView txt1 = (TextView)vi.findViewById(R.id.firma_name);
            TextView txt2 = (TextView)vi.findViewById(R.id.kontact_face_name);
            TextView txt3 = (TextView)vi.findViewById(R.id.phone_number);
            ImageView img = (ImageView)vi.findViewById(R.id.imageView1);
            
        
            HashMap<String, String> da = data.get(position);
            
            int intStatus = Integer.parseInt(da.get("status").toString());
            txt1.setText(da.get("name_company").toString());
            txt2.setText(da.get("name_contact").toString());
            txt3.setText(da.get("phone").toString());
            switch (intStatus) {
                case 0: 
                    img.setImageResource(R.drawable.vos);
                    break;
                case 1: 
                    img.setImageResource(R.drawable.clock_time_watch);
                    break;
                case 2: 
                    img.setImageResource(R.drawable.cross);
                    break;
                case 3:
                    img.setImageResource(R.drawable.button_ok);
                    break;
                default: img.setImageResource(R.drawable.vos);
                break;
            }
            
            
            
            
            
            return vi;
            
        
    
 
}
 
}
0
YuraAAA
1578 / 1319 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
19.03.2015, 16:51 #4
vindigo, HashMap приезжает из базы? Самый лучший (и более правильный) вариант создать свою модель. Где будет 4 Ваших String переменных + id из базы. Если не поняли, спрашивайте, посмотрим вместе И покажите как запрос к БД делаете.
0
vindigo
20 / 20 / 3
Регистрация: 15.05.2014
Сообщений: 80
19.03.2015, 17:02  [ТС] #5
Подключаюсь к базе из этой активити, которая содержит ЛистВью
Если честно, не понял про модель... Можно подробней?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package com.gladyreff.mafcon;
 
import java.util.ArrayList;
import java.util.HashMap;
 
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
 
public class ClientList extends ListActivity {
    
    DBHelper dbHelper;
    ArrayList<HashMap<String, String>> klientsList;
    private ListView lv;
    private Button btnAddNewKlient; 
    int intIdKlient;
    
    @Override
    protected void onResume() {
        super.onResume();
        klientsList = new ArrayList<HashMap<String,String>>();
        
        btnAddNewKlient = (Button)findViewById(R.id.addNewKlient);
        btnAddNewKlient.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent goToNewKlientLay = new Intent(getBaseContext(), KlientForm.class);
                goToNewKlientLay.putExtra("state", true);
                startActivity(goToNewKlientLay);
            }
        });
        
        
        lv = getListView();
        lv.setOnItemClickListener(new OnItemClickListener() {
 
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                
                
                //TextView tv = ((Textview) view.findViewById(R.id.firma_name));
                
                // TODO Auto-generated method stub
                
                Intent goToKlient = new Intent(getBaseContext(), KlientForm.class);
                //goToKlient.putExtra("KlientID", CompanyName);
                startActivity(goToKlient);
            }
            
            
            
        });
        
        dbHelper = new DBHelper(this);
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor c = db.query("mafTB", null, null, null, null, null, null);
 
        
        if (c.moveToFirst()) {
 
          
          //int idColIndex = c.getColumnIndex("id");
          int nameColIndex = c.getColumnIndex("name_company");
          int nameContactColIndex = c.getColumnIndex("name_contact");
          int phoneColIndex = c.getColumnIndex("phone");
          //int commentColIndex = c.getColumnIndex("comment");
          int statusColIndex = c.getColumnIndex("status");
          //int emailColIndex = c.getColumnIndex("email");
 
          do {
              
            HashMap<String, String> klient = new HashMap<String, String>();
            
            klient.put("name_company", c.getString(nameColIndex));
            klient.put("name_contact", c.getString(nameContactColIndex));
            klient.put("phone", c.getString(phoneColIndex));
            klient.put("status", c.getString(statusColIndex));
             
            klientsList.add(klient);
            
            MafAd adapt = new MafAd(ClientList.this, klientsList, R.layout.klients_list_main);
            lv.setAdapter(adapt);
            adapt.notifyDataSetChanged();
            if(klientsList.size() > 15) {
                getListView().setSelection(klientsList.size() - 16);
            }
            
            
          } while (c.moveToNext());
        } else Toast.makeText(this, "База еще не создана", Toast.LENGTH_SHORT).show();
        c.close();
        db.close();
    }
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.klients_list_main);
        
        
        
    
 
}
    
    
    
    
}
0
YuraAAA
1578 / 1319 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
19.03.2015, 17:18 #6
vindigo, 1. Модель

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class DBClient implements Serializable {
 
    private int id;
    private String name;
    private String contact;
    private String phone;
    private String status;
 
    public DBClient(int id, String name, String contact, String phone, String status) {
        this.id = id;
        this.name = name;
        this.contact = contact;
        this.phone = phone;
        this.status = status;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getContact() {
        return contact;
    }
 
    public void setContact(String contact) {
        this.contact = contact;
    }
 
    public String getPhone() {
        return phone;
    }
 
    public void setPhone(String phone) {
        this.phone = phone;
    }
 
    public String getStatus() {
        return status;
    }
 
    public void setStatus(String status) {
        this.status = status;
    }
}


2. Парсинг из БД

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
List<DBClient> clientList = new ArrayList<DBClient>();
 
        do {
            clientList.add(new DBClient(
            c.getInt(c.getColumnIndex("id")),
            c.getString(c.getColumnIndex("name_company")),
            c.getString(c.getColumnIndex("name_contact")),
            c.getString(c.getColumnIndex("phone")),
            c.getString(c.getColumnIndex("status")),
            ));
 
        } while (c.moveToNext());
        MafAd adapt = new MafAd(ClientList.this, clientList, R.layout.klients_list_main);
        lv.setAdapter(adapt);
        adapt.notifyDataSetChanged();
        if(clientList.size() > 15) {
            getListView().setSelection(clientList.size() - 16);
        }

3. Адаптер меняем

Цитата Сообщение от vindigo Посмотреть сообщение
private ArrayList<HashMap<String, String>> data;
на
Java
1
private List<DBClient> data = new ArrayList<DBClient>();
Конструктор тоже меняйте.


Java
1
2
3
4
5
6
7
8
9
10
11
  TextView txt1 = (TextView)vi.findViewById(R.id.firma_name);
            TextView txt2 = (TextView)vi.findViewById(R.id.kontact_face_name);
            TextView txt3 = (TextView)vi.findViewById(R.id.phone_number);
            ImageView img = (ImageView)vi.findViewById(R.id.imageView1);
            
        
            DBClient client = data.get(position);
            
            txt1.setText(client.getName());
            txt2.setText(client.getCompany());
            txt3.setText(client.getPhone());
1
vindigo
20 / 20 / 3
Регистрация: 15.05.2014
Сообщений: 80
19.03.2015, 17:26  [ТС] #7
YuraAAA, Спасибо, буду разбираться. Но как все-таки передать хотя бы ID в другую активность, я так и не понял.
0
YuraAAA
1578 / 1319 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
19.03.2015, 17:29 #8
vindigo, так Вы id из базы не достаёте-то) для начала id надо парсить и пробрасывать в adapter.
0
vindigo
20 / 20 / 3
Регистрация: 15.05.2014
Сообщений: 80
19.03.2015, 17:38  [ТС] #9
YuraAAA, Хорошо, ID будет присутствовать в адаптере, но как он привязан к position и каким макаром к нему обратиться?
0
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,072
20.03.2015, 09:09 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Java
1
2
3
4
5
6
7
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {  
    Cursor cursor = (Cursor) parent.getItemAtPosition(position);    
    Intent goToKlient = new Intent(getActivity(), KlientForm.class);
    goToKlient.putExtra("id", cursor.getInt(0)); // id должен быть первым в адаптере
    startActivity(goToKlient);
}
1
vindigo
20 / 20 / 3
Регистрация: 15.05.2014
Сообщений: 80
20.03.2015, 15:21  [ТС] #11
Rube, Спасибо, правда я уже сам допер... Но реализовал немного по-другому. На всякий случай выкладываю, вдруг какому-нибудь новичку вроде меня поможет:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                
    HashMap<String, String> da = klientsList.get(position); // временный хешмап
    //в него передаем пары из созданного ранее klientsList (из него кстати адаптер и наполняет      
    //листвью) на основе выбранного элемента
    int intIdClient = Integer.parseInt(da.get("id"));    // получаем значение по ключу "id"         
    Intent goToKlient = new Intent(getBaseContext(), KlientForm.class);
    goToKlient.putExtra("state", false);
    goToKlient.putExtra("KlientID", intIdClient); // суем в интент и передаем в нужную активити
    startActivity(goToKlient);
            }
Чувствую, что метод не самый изящный, и возможно не правильный, но все же работает.
YuraAAA, Вам отдельное спасибо, если я правильно понял, то вы мне показали правильный стиль программирования. Если так, то учту, а то у меня постоянно такой винегрет из переменных, массивов и т.д. получается.
0
YuraAAA
1578 / 1319 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
20.03.2015, 16:21 #12
vindigo, посмотрите вот тут например http://startandroid.ru/ru/uroki/vse-...j-adapter.html
Сделано через модель. Всегда пожалуйста
0
20.03.2015, 16:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2015, 16:21
Привет! Вот еще темы с ответами:

Передать из строки ListView в 2 поля TextView? - Программирование Android
Добрый всем! Добавлено через 8 минут есть ListView в нем добавлены/добавляются из полей TextView данные (Name и Email) а так же...

TextView и ListView с единой прокруткой ScrollView(?) - Программирование Android
Всем привет, столкнулся с проблемой при одновременном отображении ListView и TextView . Не получается отобразить эти 2 блока как единый...

Разместить TextView внутри кнопки - Программирование Android
Добрый день, каким образом можно поместить TextView как бы на кнопку и центрировать TextView относительно Button?

Как создать ListView с двумя TextView и работать с ними - Программирование Android
Как создать ListView с двумя TextView и работать с ними использую класс Adapter(Ну или чем то похожим если такое существует).


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.