Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
motoroller
2 / 2 / 1
Регистрация: 01.05.2012
Сообщений: 116
#1

Как добраться до объекта - Android

23.05.2015, 02:16. Просмотров 415. Ответов 3
Метки нет (Все метки)

В фрагменте установил слушателя по клику

Java
1
2
3
4
5
6
7
8
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
                    Log.v("My Project", String.valueOf(position));
 
                }
            });
Все работает, как получить внутри Item textView с id = body

Добавлено через 13 минут
Нашел: parent.findViewById(R.id.body).setVisibility(View.VISIBLE);

Добавлено через 3 минуты
Но осталась следующая проблема ...
по клику у меня почему-то появляются несколько textView.

Смысл у меня выводится несколько новостей, по клику на Item? хочу чтобы у этой новости покалось textView body
у которого свойто visible Gone
Так вот почему-то появляются еще тексты от других новостей

Добавлено через 26 минут
вывожу порядковый номер
Log.v("My Project", String.valueOf(position));

он показывает корректно, но открывает не всегда корректную новость а иногда сразу несколько скажите в чем может быть проблема?

Добавлено через 36 минут
Часто после нескольких кликов по новостям появляется ошибка:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

Добавлено через 3 минуты
Пытался обращаться так же:
parent.getChildAt(position).findViewById(R.id.body).setVisibility(View.VISIBLE);

Все равно то срабатывает потом нет и почему открывает не только дочернююий текст новости но и из других новостей
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2015, 02:16     Как добраться до объекта
Посмотрите здесь:

Android Динамическое создание объекта
Android Определение объекта
Как получить значения margin у объекта Android
Android Как добраться до записей (notifications) в статус-баре
Загрузка 3d объекта из файла Android
Создание объекта класса Android
Можно ли для объекта определить оператор[] как в C# Android
Как получить доступ к методам объекта класса наследуемого от Activity, когда он выводится во вкладку Android
Android Как "добраться" до Linux?
Парсинг JSON объекта Android
Как добраться до файлов на реальном устройстве Android
Android Как определить, смотрим ли мы в сторону объекта?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
254 / 230 / 93
Регистрация: 11.01.2015
Сообщений: 649
23.05.2015, 11:30     Как добраться до объекта #2
Java
1
2
3
4
5
6
7
8
9
10
 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//если хочешь искать элементы в нажатом Вью его и используй
view.finViewById(R.id.....);
//Если нужно обратиться к другому элементу списка пиши
parent.getChildAt(position).findViewById(R.id.....).....
 
                }
            });
А если покажешь код и спросишь более конкретно, то вероятность подсказки увеличится в разы
motoroller
2 / 2 / 1
Регистрация: 01.05.2012
Сообщений: 116
23.05.2015, 16:29  [ТС]     Как добраться до объекта #3
NewsFragment.XML

здесь происходит вывод новостей, проблем с этим нет. Но почему-то по клику у меня появляется текст не только от текущей новости но и от других новостей

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
package ru.animalface.app;
 
import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.Bundle;
 
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
 
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
 
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
 
import java.util.ArrayList;
import java.util.List;
 
import ru.animalface.app.adapter.VolleyListAdapter;
import ru.animalface.app.model.News;
 
 
public class NewsFragment extends Fragment {
 
    private static List<News> newsList = new ArrayList<News>();
    private static ListView listView;
    private static VolleyListAdapter volleyAdapter;
 
    // Progress
    private ProgressDialog pDialog;
 
    public NewsFragment(){}
 
 
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 
            View rootView = inflater.inflate(R.layout.fragment_news, container, false);
 
            // Load only one time when fragment is loading
            if (savedInstanceState == null) {
 
                pDialog = ProgressDialog.show(getActivity(), null, "Загрузка данных ...", true);
                listView = (ListView) rootView.findViewById(R.id.list);
                volleyAdapter = new VolleyListAdapter(getActivity(), newsList);
                listView.setAdapter(volleyAdapter);
                RequestQueue queue = Volley.newRequestQueue(getActivity());
 
                JsonArrayRequest newsReqest = new JsonArrayRequest("http://animalface.ru/mobile/news", new Response.Listener<JSONArray>() {
                            @Override
                            public void onResponse(JSONArray response) {
                                pDialog.hide();
                                // Parsing json
 
                                Log.v("My Project", String.valueOf(response.length()));
 
                                for (int i = 0; i < response.length(); i++) {
                                    try {
                                        JSONObject obj = response.getJSONObject(i);
                                        News news = new News();
                                        news.setTitle(obj.getString("title"));
                                        news.setImage(obj.getString("image"));
                                        news.setDate(obj.getString("datePrint"));
                                        news.setBody(obj.getString("body"));
                                        newsList.add(news);
                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }
                                }
                                // notifying list adapter about data changes
                                // so that it renders the list view with updated data
                                volleyAdapter.notifyDataSetChanged();
                            }
                        }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        pDialog.hide();
                        Log.v("My Project", error.getMessage());
                    }
                });
 
                // Adding request to request queue
                queue.add(newsReqest);
 
            // Load only data second or more times
            } else {
                listView = (ListView) rootView.findViewById(R.id.list);
                volleyAdapter = new VolleyListAdapter(getActivity(), newsList);
                listView.setAdapter(volleyAdapter);
            }
 
            // По клику новости
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Log.v("My Project", String.valueOf(position));
                    //Log.v("My Project", String.valueOf(id));
                    view.findViewById(R.id.body).setVisibility(View.VISIBLE);
                }
            });
 
            return rootView;
        }
}
VolleyListAdapter

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
package ru.animalface.app.adapter;
 
import ru.animalface.app.R;
import ru.animalface.app.app.AppController;
import ru.animalface.app.model.News;
 
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.text.Html;
import android.text.SpannableString;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
 
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
 
public class VolleyListAdapter extends BaseAdapter {
    private Activity activity;
    private LayoutInflater inflater;
    private List<News> newsItems;
    ImageLoader imageLoader = AppController.getInstance().getImageLoader();
 
 
 
    public VolleyListAdapter(Activity activity, List<News> newsItems) {
        this.activity = activity;
        this.newsItems = newsItems;
    }
 
    @Override
    public int getCount() {
        return newsItems.size();
    }
 
    @Override
    public Object getItem(int location) {
        return newsItems.get(location);
    }
 
    @Override
    public long getItemId(int position) {
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
 
        if (inflater == null)
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null)
            convertView = inflater.inflate(R.layout.drawer_list_news, null);
 
        if (imageLoader == null)
            imageLoader = AppController.getInstance().getImageLoader();
        NetworkImageView thumbNail = (NetworkImageView) convertView
                .findViewById(R.id.thumbnail);
 
        TextView title = (TextView) convertView.findViewById(R.id.title);
        TextView date = (TextView) convertView.findViewById(R.id.date);
        TextView body = (TextView) convertView.findViewById(R.id.body);
 
        // getting news data for the row
        News n = newsItems.get(position);
 
        // thumbnail image
        thumbNail.setImageUrl(n.getImage(), imageLoader);
        
        // title
        title.setText(n.getTitle());
 
        // body
        body.setText(Html.fromHtml(n.getBody()));
 
        // date
        date.setText(n.getDate());
 
        return convertView;
    }
 
}
Модель новостей
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
package ru.animalface.app.model;
 
public class News {
    private String title, image, date, body;
 
    public News() {}
 
    public News(String title, String image, String date, String body) {
        this.title = title;
        this.image = image;
        this.date = date;
        this.body = body;
    }
 
    public String getTitle() {
        return title;
    }
 
    public void setTitle(String title) {
        this.title = title;
    }
 
    public String getImage() {
        return image;
    }
 
    public void setImage(String image) {
        this.image = image;
    }
 
    public String getDate() {
        return date;
    }
 
    public void setDate(String date) {
        this.date = date;
    }
 
    public String getBody() {
        return body;
    }
 
    public void setBody(String body) {
        this.body = body;
    }
    
}
Вывод новостей

XML
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/news_bg" />
 
</RelativeLayout>
Вывод текущей новости

XML
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:id="@+id/rl"
        android:padding="20dp">
 
        <!-- Image -->
        <com.android.volley.toolbox.NetworkImageView
            android:id="@+id/thumbnail"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_alignParentLeft="true"
            android:layout_marginRight="8dp"
            android:background="@drawable/news_image_border"/>
 
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_centerVertical="true">
 
            <!-- Title -->
            <TextView
                android:layout_marginLeft="100dp"
                android:id="@+id/title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="15dp"
                android:textStyle="bold"
                android:textColor="@color/actionBar_backround"/>
 
            <!-- Date -->
            <TextView
                android:layout_marginLeft="100dp"
                android:id="@+id/date"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/title"
                android:layout_marginTop="1dip"
                android:textSize="14dp" />
 
            </RelativeLayout>
 
        </RelativeLayout>
 
    <!-- Body -->
    <TextView
        android:id="@+id/body"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/rl"
        android:textColor="#000"
        android:textSize="16dp"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:paddingBottom="20dp"
        android:visibility="gone" />
 
</RelativeLayout>
Вроде бы все просто, и самое сложное работает корректно, то есть новости запрашиваются и выводятся с картинками, при выводе я скрываю текст новости, по клику на новость хочу чтобы ТОЛЬКО у текущей показывался текс.

Добавлено через 33 минуты
За основу я брал этот пример: http://www.androidhive.info/2014/07/...-using-volley/

Код так же там там скачать можно
Так я взял пример и добавил обработчик нажатия

Java
1
2
3
4
5
6
7
listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                view.findViewById(R.id.title).setVisibility(View.GONE);
 
                Log.d("my_project", "itemClick: position = " + position + ", id = " + id);
            }
        });
Проблема аналогичная, я скрываю title а он скрывается сразу у нескольких объектов а не только у текущего

Добавлено через 25 минут
Подскажите может быть эта проблема в библиотеке?

Потому что попробовал другой пример: https://github.com/ogrebgr/android_volley_examples

Сделал аналогичный обработчик и так данные скрываются сразу у нескольких объектов.

Добавлено через 15 минут
Пробовал так же:

Log.v("My Project", String.valueOf(position));
parent.getChildAt(position).setVisibility(View.GONE);

В логах выводится номер верный, то есть 1,2,3...
А вот исчезают строки не те или больше чем надо
Rube
911 / 559 / 88
Регистрация: 13.02.2014
Сообщений: 2,070
02.06.2015, 15:33     Как добраться до объекта #4
Все очень просто:
1. Добавь в класс News поле boolean bodyVisible и пару методов:
Java
1
2
3
4
5
6
7
    public void setBodyVisible(boolean visible) {
        this.bodyVisible = visible;
    }
    
    public boolean getBodyVisible() {
        return bodyVisible;
    }
2. В методе getView класса VolleyListAdapter отображаем видимость объекта:
Java
1
body.setVisibility(n.getBodyVisible() ? TextView.VISIBLE : TextView.GONE);
3. В onItemClick класса NewsFragment управляем видимостью объекта:
Java
1
2
newsList.get(position).setBodyVisible(true);
volleyAdapter.notifyDataSetChanged();
А ежели надо по клику менять true|false то вот так вот:
Java
1
2
3
News n = newsList.get(position);
n.setBodyVisible(!n.getBodyVisible());
volleyAdapter.notifyDataSetChanged();
Yandex
Объявления
02.06.2015, 15:33     Как добраться до объекта
Ответ Создать тему
Опции темы

Текущее время: 16:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru