Обновление MainActivity из класса.

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Обновление MainActivity из класса.

Сообщение bydirect » 03 авг 2015, 19:35

Приветствую. Подскажите как быть. Есть 2 класса, один MainActivity.class в котором генерируются данные для ListView, второй BoxAdapter.class - кастомный адаптер для ListView.
Нужно при прокрутке списка до конца, подгружать данные в низ списка.
В BoxAdapter определяю конец списка так:
[syntax=java5]if (position == getCount() - 1) {
Log.d("ListView:", "END");
}[/syntax]

Для добавления данных в ListView, в MainActivity есть метод UploadsContent. Как можно вызвать этот метод из класса BoxAdapter?

Пробовал так :
MainActivity ma = new MainActivity();
ma.UploadsContent();

Но приложение вылетает с ошибкой
  • E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.ru.testapps/com.ru.testapps.MainActivity}: java.lang.InstantiationException: can't instantiate class com.ru.testapps.MainActivity; no empty constructor
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2381)

ANdriy123456
Сообщения: 138
Зарегистрирован: 27 июн 2014, 01:41

Re: Обновление MainActivity из класса.

Сообщение ANdriy123456 » 03 авг 2015, 20:12

Код: Выделить всё

int position =0;
boolean flag_loading  = false;

//listview = list

list.setOnScrollListener(new OnScrollListener() {

        public void onScrollStateChanged(AbsListView view, int scrollState) {


        }

        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

            if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0)
            {
                if(flag_loading == false)
                {
                    flag_loading = true;
                    UploadsContent();
                    flag_loading = false;
                    position = firstVisibleItem;
                }
            }
        }
    });
list.setAdapter(..........);
list.setSelection(position);
должно работать.

bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Re: Обновление MainActivity из класса.

Сообщение bydirect » 03 авг 2015, 20:52

ANdriy123456 писал(а):
должно работать.
Большое спасибо Действительно работает.
Вот только одна проблема. При добавлении контента ListView отматывается до самого верха. И опять приходится мотать вниз.


И почему-то функция UploadsContent() при таком решении вызывается 3 раза подряд.
Последний раз редактировалось bydirect 03 авг 2015, 21:03, всего редактировалось 1 раз.

ANdriy123456
Сообщения: 138
Зарегистрирован: 27 июн 2014, 01:41

Re: Обновление MainActivity из класса.

Сообщение ANdriy123456 » 03 авг 2015, 21:03

int position =0;
boolean flag_loading = false;
должны быть в начале класса.

вобщем после setAdapter нужно прокрутить список к позиции position.
если не будет работать то сбросьте код MainActivity

bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Re: Обновление MainActivity из класса.

Сообщение bydirect » 03 авг 2015, 21:22

ANdriy123456 писал(а): если не будет работать то сбросьте код MainActivity
Попробовал прокрутить до нужной позиции. Реакции 0. Прошу прощения за говнокод. Только учусь.

[syntax=java5]
public class MainActivity extends Activity {
static final String RSS_ID = "10546";
int offset=0;
ListView lvMain;
ArrayList<Elements> postArray = new ArrayList<Elements>();
BoxAdapter boxAdapter;
int position =0;
boolean flag_loading = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final SwipeRefreshLayout swipeView = (SwipeRefreshLayout)findViewById(R.id.swipe);
lvMain = (ListView) findViewById(R.id.lvMain);
swipeView.setColorScheme(android.R.color.holo_blue_dark, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_green_dark);
new ParsTask().execute(offset + ""); //забираем данные при первом старте.

swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
swipeView.setRefreshing(true);
(new Handler()).postDelayed(new Runnable() {
@Override
public void run() {
swipeView.setRefreshing(false);
postArray = new ArrayList<Elements>();
new ParsTask().execute(offset + "");
}
}, 1000);
}
});
// SCROLL
lvMain.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0)
{
if(flag_loading == false)
{
flag_loading = true;
UploadsContent();
flag_loading = false;
position = firstVisibleItem;
}
}
}
});

//CLICK

lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(MainActivity.this, PostActivity.class);
intent.putExtra("text", postArray.get(position).text);
intent.putExtra("images", postArray.get(position).img);
startActivity(intent);
}
});
}

class ParsTask extends AsyncTask<String, Void, String> {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
//..........
}

@Override
protected String doInBackground(String... off) {
String responseText = null;
HttpResponse response = null;
try {
//..........
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return responseText;
}

@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
JsonPars(result);
}
}

public void JsonPars(String result){
String imageLogo = "";
String text = "";
try {
JSONObject jsonObject = new JSONObject(result);
JSONArray res = jsonObject.getJSONArray("response");
for (int i = 1; i < res.length(); i++) {
JSONObject arrayElement = res.getJSONObject(i);
//text
try {
text = arrayElement.getString("text");
Log.d("Result:", "TEXT: " + text);
} catch(JSONException e) {
e.printStackTrace();
text="";
}
//image
try {
imageLogo = arrayElement.getJSONObject("attachment").getJSONObject("photo").getString("src_big");
Log.d("Result:", "IMAGE: " + imageLogo);
} catch(JSONException e) {
e.printStackTrace();
imageLogo ="";
}

if (text.equals("") || imageLogo.equals("")) continue;
text = text.replace("<br>", "\n");
postArray.add(new Elements(text, imageLogo));
}
Adapter(postArray);
} catch (JSONException e) {
e.printStackTrace();
}
}

public void Adapter(ArrayList<Elements> postArray) {
Log.d("Adapter", "Adapter");
boxAdapter = new BoxAdapter(this, postArray);
ListView lvMain = (ListView) findViewById(R.id.lvMain);
lvMain.setAdapter(boxAdapter);
lvMain.smoothScrollToPosition(20);
}
public void UploadsContent() {
offset+=20;
new ParsTask().execute(offset + "");
}
}[/syntax]

ANdriy123456
Сообщения: 138
Зарегистрирован: 27 июн 2014, 01:41

Re: Обновление MainActivity из класса.

Сообщение ANdriy123456 » 03 авг 2015, 22:02

public void Adapter(ArrayList<Elements> postArray) {
Log.d("Adapter", "Adapter");
boxAdapter = new BoxAdapter(this, postArray);
ListView lvMain = (ListView) findViewById(R.id.lvMain);
lvMain.setAdapter(boxAdapter);
lvMain.setSelection(position);
lvMain.smoothScrollToPosition(20); // что здесь делается? скорей всего строку можно удалить
}

bydirect
Сообщения: 70
Зарегистрирован: 11 июн 2014, 10:36

Re: Обновление MainActivity из класса.

Сообщение bydirect » 04 авг 2015, 00:23

ANdriy123456 писал(а):public void Adapter(ArrayList<Elements> postArray) {
Log.d("Adapter", "Adapter");
boxAdapter = new BoxAdapter(this, postArray);
ListView lvMain = (ListView) findViewById(R.id.lvMain);
lvMain.setAdapter(boxAdapter);
lvMain.setSelection(position);
lvMain.smoothScrollToPosition(20); // что здесь делается? скорей всего строку можно удалить
}
Это я как раз и пытался сделать прокрутку.

Ответить